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

Wrong value printed when implementing chaining methods

我得到了一个特定的主

int main() {

  Widget w;

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

  w.print();
}

我需要编写一个 class 小部件,以便程序打印 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();
}

知道如何解决这个问题吗? 感谢所有愿意给点建议的人:)

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

发生这种情况是因为您在第一次调用 set 后保持原始 w 不变。

我碰巧是因为你在每个操作的每个 return 上复制 w

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

您应该 return 参考:

//    v--- There
Widget& set(int i){
    this->m_i = i;
    return *this; // No copy, return type is a `Widget` reference
}

不复制小部件变量将导致 w 发生变异而不是临时副本。

事情是这样的:setprint 都应该 return *this 作为参考。添加它(将 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;
}

但实际上你会将 print 声明为 const 函数,因为能够打印 const 对象是有意义的