2012-06-14 3 views
2

그래서 여기 내 딜레마 :C++ 가상 상속, 클래스 가시성?

나는 기본 클래스를 가지고는 (의는 일반 Person 클래스를 가정 해 봅시다) :

class Person{ 
public: 
    Person(); 
    ~Person(); 
    virtual void Init(); 
    virtual void SaySomething(); 
}; 

가 지금은 다른 클래스는 이러한 방법을 상속 갖고 싶어.

class Manager{ 
public: 

    void Init(); 
    void Run(); 

    void SwitchPerson(Person* p); 

protected: 
    vector<Person*> people; 
}; 

나는 노동자가 사람의 자식 클래스 인과 준 예는 아마도 최고의되지 않습니다 :

class Worker: public Person{ 
public: 

    Worker(); 
    ~Worker(); 

    void Init(){ 
    // would do some special initializing. 
    } 

    void SaySomething(){ 
    // Print something about the worker. 
    } 

}; 

는 지금은 관리자 클래스를 가질 것이다. 그러나 요점은 클래스의 내용이 아니라 상속이고 더 구체적으로 클래스가 다른 클래스를 이해하고 알 수있는 방법입니다.

지금 내 주요 기능에 나는 다음있을 것입니다 :
int main() 
{ 
    Manager* m = new Manager(); 
    m->Init(); 

    // Create a new worker; 
    Person* w = new Worker(); 

    m->SwitchPerson(w); 

    return 0; 
} 

가 지금은 확실하지 오전이 문제를 접근하는 올바른 방법 인 경우. 문제는 무제한의 자식 클래스가있을 수 있고 관리자 클래스가 해당 자식 클래스를 알 수 없다는 것입니다. 관리자 클래스는 상위 (Person) 클래스에 대해서만 알고 있습니다. 그래서 SwitchPerson은 Person 클래스의 새로운 Worker 클래스를 추가 할 것입니다. (이것이 구조적으로 올바르지 않은지 확실하지 않습니다. 그러나 먼저 벡터에 Worker Classes가 없는지 확인해야합니다. 나는 typeid.name을 사용해 보았습니다 만, 이것은 분명히 부모 (Person) 클래스의 이름을 돌려줍니다.

나는 벡터가있는 템플릿을 사용하려고 생각했지만 관리자 클래스가 Worker 또는 다른 하위 클래스에 대해 알 필요가있다.

내가 다른 것을 설명하거나 관련 정보를 추가해야하는 경우 알려주세요.

편집 :

참고 : 용어 사람, 노동자, 그리고 관리자는 무관하다. 카메라, 렌즈, 스테이지가 될 수 있습니다.

SwitchPerson :

이의는 한 사람이 한 번에 활성화 될 수 있다고 가정 해 봅시다. Camera, Lens 및 Stage 비유로는 더 많은 의미가 있습니다. 단 한 대의 카메라 만 화면에 갈 수 있으므로 말할 수 있습니다.

카메라 비유로 유지한다고 가정 해 봅시다. 첫 번째 장면이 있고 우리는 먼저 SwitchCamera()를 호출하고 새 카메라를 전달합니다. 그러나 문제는 Stage 객체 (관리자가 될 것입니다)가 렌즈 또는 다른 유형의 렌즈에 대해 알지 못하는 것입니다. 100 또는 10000 일 수 있습니다. 중요하지 않습니다. 장면은 모든 렌즈 클래스의 기본 클래스 인 카메라에 대해서만 알고 있습니다.

그래서 switchCamera()를 사용하면 렌즈를 제어하기 위해 객체를 사용할 수 있습니다 (사실은 아니지만 실제로는 아닙니다). 모든 컨트롤은 Camera 기본 클래스 내에서 가상 멤버로 먼저 구현됩니다. 그래서 렌즈 수업에는 모두 같은 멤버가 있습니다.

이제 첫 번째 장면을 끝내고 카메라를 다시 전환하고 싶습니다. SwitchCamera()를 다시 호출하고 새로운 두 번째 카메라를 전달합니다.스위치 카메라에서 목표는 전달 된 카메라 객체를 활성 카메라로 설정 한 다음 벡터로 푸시하는 것입니다.

하지만 우리는 같은 렌즈 두 장을 원하지 않습니다. 이것은 문제가있는 곳입니다. Camera * camera = new Lense123();에 전달되었는지 여부를 확인할 수 있기를 원합니다. 이미 벡터 안에 있습니다. 그럴 경우 원래의 것을 사용하고 새로 전달 된 것을 버리려고합니다.

+2

'매니저 m();'은 오브젝트'm'을 작성하지 않습니다. [가장 괴롭히는 구문 분석] (http://en.wikipedia.org/wiki/Most_vexing_parse). 괜찮은 컴파일러라면 경고해야합니다. – Mahesh

+0

방금 ​​코드를 작성 했으므로 문제의 실제 구현은 사람, 작업자 또는 관리자와 관련이 없습니다. – Daniel

+0

사람을 Abstract-Class로 만들 수 있습니까? – memosdp

답변

3

당신이 관리자 독특한 사람의 벡터를 갖고 싶어처럼 소리, 당신은 노동자를 가질 수 있습니다 즉, 그리고 사람을 구현하지 수 있으며, 제 3 자 (벡터에서 각각 하나 이상)? 서브 클래스의 문자열 레이블을 반환하는 Person에서 함수를 오버로드하지 않고 각각에 대해 pPerson-> GetLabel()을 호출하는 벡터를 반복하고 벡터에 추가하려고하는 새 객체의 레이블과 비교하는 것이 가장 좋은 이유는 무엇입니까? .

관리자는 여전히 Person 클래스에 대해서만 알고 있고 Person의 다른 하위 클래스에 대해 알 필요는 없지만 각 유형에서 고유 한 문자열을 다시 가져올 수 있습니다.

+0

그리고 내 코드를 크래킹했습니다. 이것은 정확히 내가 찾고 있던 것이며, 물론 그것은 그렇게 단순한 것으로 끝났습니다. 고맙습니다!:) – Daniel

+2

멋지다. 다행이다. – jacobsee

+0

GetLabel()을 오버로드하는 대신 Person 클래스의 m_label이라는 문자열을 Protected로 추가하기 만했다. Person 클래스에서는 m_label을 반환하는 GetLabel 메서드를 사용합니다. m_label은 Worker 또는 임의의 서브 클래스 생성자 내에 설정됩니다. – Daniel

0

관리자는 사람이고 관리자는 사람이 아닙니다. 저는 Person으로부터 Manager를 상속 받았고 Manager에는 1 ... N 직원이 ​​있으므로 할 수있는 가장 좋은 방법은 다음과 같습니다. Person으로부터 상속 관리자 Manager에 벡터가 있습니다. 나는 Person 클래스는 가상 만들 것, 그래서 하나는 "사람"

+0

내가 명확하게하지 않았던 것 같아요 ... 관리자는 Person 개체를 관리하는 클래스 이름이었습니다. 그것은 사람이나 작업자와 관련이 없습니다. 사람, 작업자 및 관리자는 관련이 없습니다. 카메라, 렌즈 및 스테이지입니다. 내가 옳게하려는 부분은 Manager/Stage가 자식 요소를 알 수 없지만 자식 요소를 벡터로 유지하는 방법입니다. – Daniel