实施链接方法时打印出错误的值
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
发生变异而不是临时副本。
事情是这样的:set
和 print
都应该 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 对象是有意义的
我得到了一个特定的主
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
发生变异而不是临时副本。
事情是这样的:set
和 print
都应该 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 对象是有意义的