给我一个特定的主要内容
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();
}
关于如何解决这个问题的任何想法?感谢所有愿意提供建议的人:)
您缺少的是从您的函数返回的对象需要作为参考,例如一个Widget&
,而不是Widget
。目前,您从每个set()或print()调用返回一个全新的副本,这意味着对该对象的任何进一步更改都不会应用于原始w
对象。
发生这种情况是因为在第一次调用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
}
不复制widget变量将导致w
变异而不是临时副本。
事情是这样的:set
和print
都应该通过引用返回*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对象是有意义的