如何知道std :: list是否已被修改

时间:2012-07-07 07:53:30

标签: c++ list

  

可能重复:
  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的功能,是否可能?

4 个答案:

答案 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