추상 클래스를 사용하여 메모리를 다양한 인스턴스에 할당하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/368976

  •  21-08-2019
  •  | 
  •  

문제

C ++에서 순수한 가상 방법을 정의하는 추상 클래스가 있습니다.

class Base
{
Base();
~Base();

virtual bool Test() = 0;
};

나는 이것을 여러 다른 클래스 (test ()에 구현을 제공하는)로 이것을 서브 클래싱했으며, 이는 a, b, c 등이라고합니다. 이제 이것을 사용하여 이러한 유형의 배열을 만들고 싶습니다. 기본 클래스 :

int main(int argc, char* argv[])
{
    int size = 0;
    Base* bases = new Base[10];

    bases[size++] = new A();
    bases[size++] = new B();

    for (int i = 0; i < size; i++)
    {
        Base* base = bases[i];
        base->Test();
    }
}

(내가 만든 오류를 실례합니다. 간단한 예를 제공하기 위해 이것을 즉시 작성하고 있습니다).

문제는 기본 클래스의 인스턴스를 만들어야하므로 배열을 인스턴스화 할 수 없다는 것입니다 (추상적으로 할 수 없음). 그러나이 작업을 수행하지 않으면 배열의 지수에 할당하는 데 필요한 메모리를 할당하지 않았으므로 해당 메모리에 액세스하려고 할 때 세분화 오류를 제공합니다. 나는 새로 혼합하고 Malloc과 무료로 삭제하는 것이 좋은 관행이 아니라는 인상을 받고 있습니다.

이것이 사용되는 방식을 혼란스럽게했을 수도 있고 템플릿이나 다른 메커니즘을 사용하여이를 수행하려고 시도해야하지만, 제가 시도하는 일을 설명하기에 충분한 정보를 제공하기를 바랍니다.

그렇다면이 작업을 수행하는 가장 좋은 방법은 무엇이며 추상 클래스에 메모리를 할당하는이 문제를 어떻게 얻을 수 있습니까?

감사합니다, 댄

도움이 되었습니까?

해결책

해당 코드에는 약간의 오해가 있습니다. 기본 객체를 할당하는 대신 포인터를 할당해야합니다. 포인터는 언제든지 존재할 수 있습니다. 추상 클래스에 대한 포인터, 불완전한 유형, 심지어 무효에 대한 포인터가 유효합니다.

int main(int argc, char* argv[])
{
    int size = 0;
    Base** bases = new Base*[10];

    bases[size++] = new A();
    bases[size++] = new B();

    for (int i = 0; i < size; i++)
    {
        Base* base = bases[i];
        base->Test();
    }
}

다른 팁

먼저, 소멸자가 가상으로 선언되어 있는지 확인하십시오.

virtual ~Base();

인스턴스에 다양한 포인터를 저장하는 것이 좋습니다.

Base** bases = new Base *[10];

배열은 모든 요소가 동일한 크기 인 것에 의존합니다. 동일한베이스에서 도출 된 C ++ 클래스가 있으면 인스턴스는 어떤 크기가 될 수 있습니다. 따라서베이스가 추상적이든 아니든 기본 인스턴스 배열을 할당 한 다음 파생 된 인스턴스를 넣을 수 없습니다.

다른 답변에서 말하면, 당신은 포인터를 사용해야합니다. 다양한 포인터를 기본으로 할당 한 다음 다양한 파생 인스턴스를 할당하고 배열에 포인터를 저장하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top