超载类还是?

时间:2014-04-14 16:26:39

标签: c++

我不太了解如何制作类似这样的课程/结构:

std::stringstream ss;
ss.str().c_str();

我想做类似的事情,例如:

int result = MyAssignFunction(10, 5).AddParametrs();
// or
int result = MyAssignFunction(10, 5).FirstParametr;

我不能说出这就是为什么我找不到任何提示。 主要问题是甚至可能吗?请给我任何提示。

2 个答案:

答案 0 :(得分:3)

函数MyAssignFunction需要返回一个具有AddParametrs成员函数或FirstParametr成员变量的对象。

但您需要注意示例中MyAssignFunction返回的对象是 temporary 。一旦表达式结束,它就会被破坏。


非常 简单 示例:

#include <iostream>

struct S
{
    int value;

    S(int initial) : value(initial) {}

    S& add1() { value++; return *this; }
    S& add2() { value += 2; return *this; }
    S& addN(int n) { value += n; return *this; }

    int get() const { return value; }
};

int main()
{
    std::cout << "Operation = " << S(0).add1().add2().add1().addN(5).get() << '\n';
}

上面的小虚拟程序将打印

Operation = 9

执行“魔法”的表达式是S(0).add1().add2().add1().addN(5).get()。它首先创建结构S的(临时)对象,并将0传递给构造函数。然后在这个对象上我们调用成员函数add1,它返回对自身的引用,在该引用上我们调用add2,依此类推。最后,我们调用成员函数get来获取最终值并输出它。

如您所见,我们可以按任意顺序链接任意数量的函数调用。

以上只是一个非常简单的示例,它允许对象链接自身的调用。成员函数可以返回另一个对象(或引用),然后您可以将调用链接到该对象的成员函数。这就是您在stringstream示例中看到的内容:str函数返回std::string对象,并在c_str对象上调用std::string

答案 1 :(得分:0)

如果您正在寻找方法链接,这意味着您可以重用函数调用的输出,就好像它是您的函数被调用的对象一样,您需要做的就是返回{{1 }}。因此,您的返回值应该是您尝试实现方法链接的类类型。为避免不必要的复制构造函数调用,您还应该通过引用返回。这是一个小例子:

*this