Group
のサブクラスですElement
。どのグループにも要素を含めることができます (もちろん、グループにすることもできます)。各要素は、それ自体を含むグループに登録され、コンストラクターに渡されます。しかしdynamic_cast
、コンストラクターが終了するまで機能しないようです。
コンストラクターから自動的に呼び出すadd_element
ことはできますが、オブジェクトの準備が十分に整っていることを確認できdynamic_cast
ますか?
#include <iostream>
#include <vector>
class Group;
class Element {
public:
Element(Group* group);
virtual ~Element();
private:
Group* group;
};
class Group : public Element {
public:
Group(Group* group);
void add_element(Element* element);
void remove_element(Element* element);
private:
std::vector<Element*> elements;
};
Element::Element(Group* group) : group(group)
{
if (group)
group->add_element(this);
}
Element::~Element()
{
if (group)
group->remove_element(this);
}
Group::Group(Group* group) : Element(group)
{
}
void Group::add_element(Element* element)
{
if (dynamic_cast<Group*>(element))
std::cout << "Adding a group" << std::endl;
else
std::cout << "Adding an element" << std::endl;
elements.push_back(element);
}
void Group::remove_element(Element* element)
{
// No need to implement this actually...
}
int main()
{
Group* parent = new Group(0);
Group* child = new Group(parent);
}
注:dynamic_cast
ここでの元の質問は異なっていましたが、それは問題ではないことが判明しました。dynamic_cast
コンストラクターにあります。