我曾见过这一次,但我不记得如何再次使用它。假设我有三个班级:
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(). ...;
?
答案 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