可能重复:
Create std::list of value instead of std::list of pointers in recursive function
我有这堂课:
class C
{
public:
C* parent;
std::list<C> children;
};
我可以这样使用这个类,例如:
C root;
C child;
root.children.push_back(child); // or other method of std::list (es: push_front, insert, ...)
// Here child.parent is root
// How can I set the parent of child?
我想在内部完成这项工作而不会失去std::list
的功能,是否可能?
答案 0 :(得分:2)
如果我正确理解你的问题,你需要这样的东西:
class C {
public:
C* parent;
std::list<C *> children;
explicit C(C *p = 0) : parent(p) {
if (p) p->children.push_back(this);
}
};
C root;
C child(&root);
请注意,我更改了您的children
列表以获取指针。只要不期望C
管理节点的内存,只需引用它们就可以了。
您的问题的标题是:如何知道std :: list是否已被修改。根据您的评论,您似乎想要的是代理:
class ListProxy {
std::list<C *> children;
public:
// replicate list traits
// ...
void push_back (C *c) {
children.push_back(c);
//... do something
}
void erase (iterator i) {
children.erase(i);
//... do something
}
//...
};
代理将列表功能委托给列表,但增加了那些会改变列表的方法的行为。
class C {
public:
C* parent;
ListProxy children;
explicit C(C *p = 0) : parent(p) {
if (p) p->children.push_back(this);
}
};
答案 1 :(得分:1)
您可以在班级中实现界面功能。例如:
class C
{
private:
std::list<C *> children;
public:
C* parent;
void AddChild(C *child);
};
然后,只需在AddChild函数中执行此操作:
void C::AddChild(C *child)
{
children.push_back(child);
// Do internal work here...
}
答案 2 :(得分:1)
我建议你添加一个成员函数:
class C
{
C* parent;
std::list<C> children; //make it private first
public:
void add_child(C const & child)
{
children.push_back(child);
children.back().parent = this; //make `this` child's parent
}
};
答案 3 :(得分:0)
首先:由于您似乎自己拥有链接列表,因此您只需在类中添加AddChild
方法即可。这可以使用std :: list功能。
我很确定你不想存储值,而是指向C的指针 每次将其添加到列表中时都不想复制C.
public:
void AddChild(C *child)
{
this.children.push_back(child);
}
按如下方式使用:
C *root = new C();
C *child = new C();
child->parent = root;
root->AddChild(child);
您也可以在AddChild中设置父级,这样您就有机会拥有 连贯的列表(每个孩子都有一个合适的父集)。
但是,如果您对更改感兴趣,请使用观察者模式。
以下是一篇文章,其中包含c ++代码示例:Observer pattern