实施链接方法时打印的值有误

时间:2019-03-26 16:03:29

标签: c++ named-parameters

我有一个特定的主语

int main() {

  Widget w;

  w.set(3).print().set(2).print();

  w.print();
}

我需要编写一个类Widget,以便程序打印3、2、2。

我最好的尝试者打印出令人失望的3,2,3:/

class Widget{
public:
  Widget(){m_i =0;};

  Widget(int i){m_i =i;};

  Widget set(int i){
    this->m_i = i;
    return *this;
    };

  Widget print(){
    std::cout<<this->m_i<<std::endl;
    return *this;
    };
  int m_i;
};

int main() {

  Widget w;

  w.set(3).print().set(2).print();

  w.print();
}

关于如何解决这个问题的任何想法? 感谢所有愿意提供建议的人:)

3 个答案:

答案 0 :(得分:3)

您缺少的是从函数返回的对象需要作为引用,例如Widget&,而不是Widget。当前,您将从每个set()或print()调用中返回一个全新的副本,这意味着对该对象的任何进一步更改都永远不会应用于原始w对象。

答案 1 :(得分:1)

之所以会发生这种情况,是因为在您第一次调用def someController() = Action { someJavaAPI().map{ _ => Ok("done") } } 之后,原来的w保持不变。

发生这种情况是因为您在每次操作的每次返回时都复制set

w

您应该改为通过引用返回:

Widget set(int i){
    this->m_i = i;
    return *this; // Copy, return type is a `Widget` value
}

不复制窗口小部件变量将导致// v--- There Widget& set(int i){ this->m_i = i; return *this; // No copy, return type is a `Widget` reference } 而不是临时副本被突变。

答案 2 :(得分:0)

这是事实:setprint都应通过引用返回*this。将其添加(用{{1}替换Widget和其他一些小的修补程序)可以达到目的:

Widget&

但是实际上,您可以将#include <iostream> class Widget{ public: Widget(int m) // Initialization over assignment : m_i(m) { } Widget() // Initialization over assignment : m_i(0) { } Widget& set(int i) // return a reference { m_i = i; // this-> is not recommended return *this; }; Widget& print() // return a reference { std::cout<< m_i << std::endl; // this-> is not recommended return *this; }; private: // data members are usually private int m_i; }; int main() { Widget w; w.set(3).print().set(2).print().print(); return 0; } 声明为const函数,因为能够打印const对象是有意义的