2013-07-06 3 views
0

영어 설명 C++에서 추상 기본 클래스입니다지도에서 요소의 회원 : 나는 std::map<string, Parent *>Parent에서 "bar"의 키 요소에서 foo라는 이름의 멤버에 액세스 할은 추상적이다 기본 클래스.액세스 값

코드 :

#include <map> 
#include <string> 
#include <iostream> 

using namespace std; 

class Parent { 
public: 
    virtual ~Parent() {} 
}; 

class Child: public Parent { 
public: 
    Child(): var(2) {} 
    int var; 
}; 

int main() { 
    map<string, Parent *> children; 
    children["bar"] = new Child; 
    cout << children["bar"]->var << endl; // Erroneous line 
    cout << children.find("bar")->second->var << endl; // Different method, still gives the same error 
    return 0; 
} 

오류 :‘class Parent’ has no member named ‘var’.

나는 또한 boost::ptr_map을 사용해 보았습니다.

int main() { 
    boost::ptr_map<string, Parent> children; 
    string key = "bar"; 
    children.insert(key, new Child); 
    cout << children.find(key)->second->var << endl; // Same error :(
    return 0; 
} 
+0

컨텍스트의 비트 : 내가 [엔티티 컴포넌트 시스템]을 구현하고있어 (http://en.wikipedia.org/wiki/Entity_component_system) 여기서'Parent'에서 실제 프로그램을 , 모든 구성 요소가 상속하는 클래스가됩니다. (올바른 용어입니까?) – mcjohnalds45

+0

가상 액세스는 데이터 변수가 아닌 함수 용입니다. –

답변

5

당신은 Parent::var은 일이 아니다 때문에 Parent 포인터를 사용 var에 액세스 할 수 없습니다. 대신,이 시도 :

class Parent { 
public: 
    virtual ~Parent() {} 
    virtual int getVar() const = 0; 
}; 

class Child: public Parent { 
public: 
    Child(): var(2) {} 
    virtual int getVar() const { return var; } 
private: 
    int var; 
}; 

int main() { 
    map<string, Parent *> children; 
    children["bar"] = new Child; 
    cout << children["bar"]->getVar() << endl; // Erroneous line 
} 
+0

빠른 응답을 고맙게 생각하지만, 실제 프로그램에는 '부모'를 상속하는 많은 변수가 포함되어 있기 때문에 매우 복잡하고 어려울 것입니다. 나는 몇 가지 일반적인 C++ 기법을 놓치고 있다고 느낍니까? 최악의 경우 최악의 경우 모든 클래스를 하나의 큰 파일로 던질 수 있지만 실제로이를 피하려고합니다. – mcjohnalds45

+0

프로젝트에서 거의 모든 것을 위해 하나의 기본 클래스를 만드는 것을 생각하는 것 같습니다. 이것은 C++에서의 나쁜 생각입니다. 왜냐하면 여기에서 성취하려고하는 기능을 제공하지 않기 때문입니다 (올바르게 추측 할 때 혼란스럽지 않고). 최선의 행동 방침은 디자인을 다시 생각하는 것입니다. 아마도 다른 언어를 사용하는 것을 고려해보십시오 (일부는 루비가 한 가지 예를 선택하기 만하면이 문제가 발생하지 않을 것입니다). –