그래서 여기 내 딜레마 :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();에 전달되었는지 여부를 확인할 수 있기를 원합니다. 이미 벡터 안에 있습니다. 그럴 경우 원래의 것을 사용하고 새로 전달 된 것을 버리려고합니다.
'매니저 m();'은 오브젝트'm'을 작성하지 않습니다. [가장 괴롭히는 구문 분석] (http://en.wikipedia.org/wiki/Most_vexing_parse). 괜찮은 컴파일러라면 경고해야합니다. – Mahesh
방금 코드를 작성 했으므로 문제의 실제 구현은 사람, 작업자 또는 관리자와 관련이 없습니다. – Daniel
사람을 Abstract-Class로 만들 수 있습니까? – memosdp