0

これは一度見たことがありますが、再び機能させる方法を思い出せません。3つのクラスがあるとしましょう:

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

4 に答える 4

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);
    }
};

もう少し考えて、基本クラスを作成すると、これをより一般的に作成できます。また、レベル番号をメソッド名から移動する必要があります。

于 2013-04-21T18:17:46.740 に答える
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();
}

ポインタを参照に置き換えることはできますが、メモリ リークに注意してください。このコードもリークしますが、より管理しやすく、オブジェクトの有効期間を管理することは大きな問題ではないことに注意してください。

于 2013-04-21T18:11:35.107 に答える
0

SomeMethodの参照を返すだけです*this

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

これで、次のことができます。

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

これは、代入演算子のオーバーロードがどのように機能するかに似ています。

于 2013-04-21T18:09:45.430 に答える
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
于 2013-04-21T18:13:07.530 に答える