如果我正确理解你的问题,你想要这样的东西:
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);
}
};