我有一个特定的主语
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();
}
关于如何解决这个问题的任何想法? 感谢所有愿意提供建议的人:)
答案 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)
这是事实:set
和print
都应通过引用返回*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对象是有意义的