【问题标题】:method chaining including class constructor包括类构造函数的方法链
【发布时间】:2011-02-22 01:26:40
【问题描述】:

我正在尝试在 C++ 中实现方法链接,如果类的构造函数调用是单独的语句,那么这将非常容易,例如:

Foo foo;

foo.bar().baz();

但是一旦构造函数调用成为方法链的一部分,编译器就会抱怨期望“;”代替“。”在构造函数调用之后立即:

Foo foo().bar().baz();

我现在想知道这在 C++ 中是否真的可行。这是我的测试类:

class Foo
{
public:
    Foo()
    {
    }

    Foo& bar()
    {
        return *this;
    }

    Foo& baz()
    {
        return *this;
    }
};

我还在 C++ (http://en.wikipedia.org/wiki/Fluent_interface#C.2B.2B) 中找到了一个“流畅接口”示例,这似乎正是我正在寻找的。但是,对于该代码,我得到了相同的编译器错误。

【问题讨论】:

  • 哦,我忘了提这个:Visual Studio 2010(专业版)。
  • Foo foo = bar().baz().bang();

标签: c++ constructor methods chaining


【解决方案1】:

试试

// creates a temporary object
// calls bar then baz.
Foo().bar().baz();

【讨论】:

  • 虽然在这种情况下,返回对临时对象的引用有点狡猾;-)
  • 这里没有明确定义。因为临时对象在语句结束之前保持有效(';')。一切都是爱情和暂时的票价。
【解决方案2】:

您忘记了Foo 对象的实际名称。试试:

Foo foo = Foo().bar().baz();

【讨论】:

  • 或者您可以保存对对象的 (const) 引用,而不是将临时对象复制到新变量中。
  • @LokiAstari:不幸的是,没有,因为 baz 返回对临时的引用,而不是临时的。 (自己也犯过同样的错误)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2018-07-14
  • 2020-06-18
相关资源
最近更新 更多