类继承 - 堆栈方法

时间:2013-04-21 18:07:47

标签: c++ class inheritance

我曾见过这一次,但我不记得如何再次使用它。假设我有三个班级:

class CRoot { ... };

class CLevelOne { ... };

class CLevelTwo { ... };

现在,我有主要功能,我希望通过使用这种语法更深入地了解:

int main (void)
{
  CRoot myRoot ("This is root.");
  myroot.AddLevelOne("This is level one.").AddLevelTwo("This is level two.");
}

所以我的课程的最终结构如下:

+- This is root.
|+- This is level one.
||+- This is level two.

如何实现它,以便我可以使用语法something.Method1().Method2().MethodN(). ...;

4 个答案:

答案 0 :(得分:1)

这样的事情:

struct CLevelTwo { };

struct CLevelOne {
    CLevelTwo * AddLevelTwo() {
        return new CLevelTwo();
    }
};

struct CRoot {
    CLevelOne * AddLevelOne() {
        return new CLevelOne();
    }
};

int main(){
    CRoot *root = new CRoot();
    root->AddLevelOne()->AddLeveTwo();
}

您可以使用引用替换指针,但要注意内存泄漏。请注意,此代码也会泄漏,但它更易于管理,管理对象的生命周期应该不是一个大问题。

答案 1 :(得分:1)

试试这个:

struct Level2
{
    // See class Level1 below
};

struct Level1
{
    std::string               m_name;
    boost::shared_ptr<Level2> p_level2;
    Level1(const std::string name)
        : name(m_name)
    { ; }

    Level2& add_level_two(const std::string& name)
    {
      p_level2 = new Level2(name);
    }
};

struct Root
{
    boost::shared_ptr<Level1> p_level1;
    Level1& add_level_one(const std::string& name)
    {
      p_level1 = new Level1(name);
    }
};

稍微考虑一下基类,可以更普遍地创建它。此外,必须将级别号移出方法名称。

答案 2 :(得分:0)

只需让SomeMethod返回*this的引用:

struct Foo
{
    Foo& Add(SomeOtherThing& thing)
    {
        // Do the "add"...
        return *this;
    }
};

现在你可以做到:

Foo myFoo;
myFoo.Add(...).Add(...).Add(...);

就像赋值运算符重载的工作方式一样。

答案 3 :(得分:0)

编辑在使用Thibaut审核此内容后,我提出以下解决方案:

class Node
{
private:
    std::string _name;
    std::list<Node*> _nodes;

public:
    Node(const std::string& name) : _name(name)
    {
    }; // eo ctor

    virtual ~Node()
    {
        for(std::list<Node*>::iterator it(_nodes.begin());
            it != _nodes.end();
            ++it);
            delete *it;
    }; // eo dtor


    Node* Add(const std::string& name)
    {
        Node* newNode = new Node(name);
        _nodes.Add(newNode);
        return newNode;
    }; // eo Add
}; // eo class Node