일부 멤버를 제공하는 내 애플리케이션 구성 요소의 기본 클래스가 있으며 덮어 써야하는 Init()
및 Update()
기능이 있습니다.파생 클래스 생성자가 호출되기 전에 기본 클래스 멤버를 설정하는 방법은 무엇입니까?
class Component
{
public:
void Set(type* Member1, type* Member2, type* Member3)
{
this->Member1 = Member1;
this->Member2 = Member2;
this->Member3 = Member3;
}
virtual void Init() = 0;
virtual void Update() = 0;
virtual ~Component() {}
protected:
type* Member1;
type* Member2;
type* Member3;
};
구성 요소를 운반 할 때 관리자가 있습니다. 먼저 구성 요소의 멤버를 설정 한 다음 Init()
을 호출합니다. 나중에 할당 된 모든 구성 요소를 업데이트하는 데 사용할 수 있지만이 질문과 관련이 없습니다. 내가 대신 Init()
기능을 덮어 초기화 자신의 생성자를 사용하는 구성 요소를하고자하기 때문에
class Manager
{
public:
void Add(string Name, Component* Component)
{
list[Name] = Component;
}
void Init(type* Member1, type* Member2, type* Member3)
{
for (auto i = list.begin(); i != list.end(); i++)
{
i->second->Set(Member1, Member2, Member3);
i->second->Init();
}
}
void Update()
{
for (auto i = list.begin(); i != list.end(); i++)
i->second->Update();
}
private:
unordered_map<string, Component*> list;
};
나는 내 구현 정말 행복하지 않다. 그러나 건설 시간에는 기본 클래스 멤버를 아직 사용할 수 없습니다.
파생 클래스 생성자를 통해 멤버를 전달할 수 있다는 것을 알고 있지만 특정 구성 요소가 기본 클래스의 멤버를 돌보는 것을 원하지 않습니다. 그것은 다음과 같을 것입니다. 그러나 어쨌든 저는 그것을 원하지 않습니다.
class Component
{
public:
Component(type* Member1, type* Member2, type* Member3)
{
this->Member1 = Member1;
this->Member2 = Member2;
this->Member3 = Member3;
}
virtual void Update() = 0;
virtual ~Component();
protected:
type* Member1;
type* Member2;
type* Member3;
};
class Specific : public Component
{
public:
Specific(type* Member1, type* Member2, type* Member3) : Component(Member1, Member2, Member3)
{
}
void Update()
{
}
};
그럼 파생 클래스의 생성자를 호출하기 전에 기본 클래스 멤버가 초기화되도록하려면 어떻게해야합니까?
멤버 초기화 자 목록에서 파생 클래스 생성자의 본문을 입력하기 전에 기본 클래스 생성자가 호출됩니다. –
"특정 구성 요소가 기본 클래스 '구성원을 돌보는 것을 원하지 않습니다. 그렇다면 왜 그들이'보호 된 '것으로 선언 했습니까? – Lundin
@ Lundin. 특정 구성 요소는이를 사용해야하지만 초기화에 신경을 써서는 안됩니다. – danijar