2014-09-25 1 views
0

Base이 기본 클래스이며, 이는 또한 derived1derived2 클래스를 파생했습니다. 나는 Base 포인터가 어떤 벡터 Base, 및 derived2 개체 수있는 벡터 만들기 동적 바인딩을 사용하고 싶습니다. 그러나 push_back() 함수가 올바른 유형이 아님을 알려줍니다. main()에서오류 : 'myVector'의 멤버 'push_back'요청. 클래스 유형이 'std :: vector <Base> *'이 아닌 클래스입니까?

코드 :

vector<Base> *myVector; 

myFunction(myVector); 

기능 :

void myFunction(vector<Base> *&myVector) 
{ 
    Base *b = new Base; 

    myVector.push_back(b); 

    delete [] b; 
} 
+1

이 잘 유형의'Base'없는 유형의'자료 * '로 벡터를 정의! 이 행은'벡터 * myVector;'기본 포인터의 벡터가 아닌'Base' 벡터의 포인터를 정의합니다 – EdChum

+3

또한 포인터를 벡터에 추가 한 직후 포인터를 삭제하고 싶지 않습니다 ... (당신이 원한다면, 당신은'delete'가 아닌'delete'를 사용합니다.) – wakjah

+1

[이것을 읽어주세요] (https://dl.dropboxusercontent.com/u/6101039/Modern%20C%2B%2B. pdf). – WhozCraig

답변

2

사용 벡터 :

void myFunction(vector<Base*> &myVector) 
{ 
    Base *b = new Base; 

    myVector.push_back(b); 
} 

가에 있지 delete b;를 수행 또한

vector<Base*> 

이 벡터에 포인터를 사용하지 않는, 당신은 참조를 통해 함수에 벡터를 전달할 수 있습니다 end of myFunction으로 푸시 된 포인터가 유효하지 않게됩니다.

마지막으로, 당신이 원하는 궁극적 것입니다 것은 그래서, unique_ptr을 사용하는 것입니다

vector<unique_ptr<Base>> myVector; 
1

시도

vector<Base *> myVector; 

코드

vector<Base> * myVector; 

vector<Base> 유형의 벡터에 대한 포인터를 만듭니다. 이는 원하는 것이 아닙니다. 원하는 것은 vector<Base *> 유형의 벡터입니다. 자료에 대한 포인터의

+0

내가 뭘 잘못했는지 알 겠어. 나는 둘 다 똑같은 줄 알았다. – user2871213

+0

잘못 한 것을 이해하는 것은 같은 실수를 다시하지 않는 중요한 단계입니다^_ ^ – Paladin

관련 문제