2014-12-09 5 views
0

안녕하세요 누군가가 다음 코드를 잘못 설명해 주시겠습니까? 먼저이 클래스를 사용하는 다른 클래스의 추상 클래스 하위를 포함합니다.다형 벡터

#include "child.h" 

다음은 하위의 인스턴스를 가리키는 포인터로 아래 2 차원 벡터를 채우고 있습니다.

vector<vector<abstractitem*>*>vec; 

다음은이 클래스 함수를 클래스에 사용하고 있습니다. get 함수는 추상 클래스에서 찾을 수 있습니다.

void fn::getall() 
{ 
    for (int i=0;i<m_nrows;i++) 
    { 
     for(int j=0;j<m_ncolumns;j++) 
     { 

      vec[i][j]->get(); //error on this line: do you intend to use . instead? 

     } 
     printf("\n"); 
    } 

} 

귀하의 도움을 많이 주시면 감사하겠습니다.

+1

당신은 아마'벡터 <벡터 > vec'를 대신 작성하는 것을 의미했습니다? – 5gon12eder

+4

'vec [i]'는'벡터 *'를줍니다. 'vec [i] [j]'는'벡터 '을줍니다. 포인터를 사방에 쓰고 싶다면 어떻게 작동하는지 이해해야합니다. – juanchopanza

+0

감사합니다. 내 문제가 해결되었습니다. 임 새로운 포인터. 왜 벡터 * 내가 vec [i]를 제공했는지 설명해 주시겠습니까? – fbdg

답변

3

당신이 중 하나는

vector<vector<abstract*>*> vec; 

vector<vector<abstract*>> vec; 

을 변경하거나 변경해야

vec[i][j]->get(); 

(*vec[i])[j]->get(); 

전자가 더 나을 것입니다. 외부 벡터가 내부 벡터에 대한 포인터를 보유해야하는 이유가 없습니다.

더 나은 사용하는 것입니다 스마트 포인터 :

vector<vector<shared_ptr<abstract>>> vec; 

는 객체 메모리 관리에서 완전히 해방

1

당신의 외부 벡터 벡터-포인터의 벡터임을 공지 사항, 아니 벡터 벡터. 당신은 마지막 줄에 오류를 볼 수 있습니다

vec[i][j]->get(); 
(vector<abstractitem*>*)[j]->get(); 
*(vector<abstractitem*>* + j)->get(); 
vector<abstractitem*> ->get(); 

: 이것은 당신의 함수 호출은 다음과 같이 해결하는 것을 의미한다() 함수는 벡터에서 실행을 시도하여 GET, 그러나 당신은 그것이 abstractitem* 것으로 기대 썼다 .

중 하나는 벡터의 벡터로 선언을 변경하거나 전화로 역 참조를 추가

vector<vector<abstractitem*>> vec; //option 1 
(*vec[i])[j]->get(); //option 2