这是一个相当简单的概念。我有一个算术运算符,我希望操作更新而不是创建一个对象。从本质上讲,
it "can upload an image" do
post :picture, avatar: fixture_file_upload('files/spongebob.png', 'image/png')
response.should be_success
end
语句MyType A;
MyType B;
MyType C;
A = B - C;
A = C - B;
不应再次调用MyType的构造函数,因为已经创建了A,即构造函数只能在此程序中调用3次。有没有办法在保持良好语法的同时实现这一目标?我怀疑我可以让操作员函数知道不要创建一个对象,而是使用一些引用。是否有一种更简化的方法来使用我不知道的c ++语法来做到这一点?
A = B - C
答案 0 :(得分:4)
没有丑陋的技巧,比如创建对象池并在内部使用它们(复杂性比这种情况下的任何好处更复杂),没有办法实现这一点。问题是那个声明:
A = B - C;
等于:
A.operator=( operator-( B, C ) );
正如您所见,operator-( B, C )
必须先执行并在某处提供结果。所以你要么改变语法,如:
A += B; A -= C; // or even
(A += B) -= C; // or maybe
A += B -= C;
或使用常规语法,如果需要效率实现移动语义。
经过一番思考后,您可以创建MyTypeExression
类型的对象,该对象不进行实际计算,但会记住参数和操作,并且仅在执行MyType::operator=(MyTypeExression)
时才执行。虽然为了工作你可能需要一个带有MyType
智能指针的包装器,所以MyTypeExression
不必复制它的参数。所以这个解决方案可以被认为是我之前提到的复杂技巧。
答案 1 :(得分:2)
我希望操作更新不创建对象
对于A = B - C;
,A
将{strong}更新,operator=
。
更具体地说,operator-
的返回值是按值传递的,必须在operator-
中创建临时变量,然后复制/移动到A
。
BTW1:OperatorReturnObj= Left - Right;
将导致无限递归。
BTW2:MyType A();
确实是一个函数声明。 Most vexing parse
答案 2 :(得分:1)
你不能。
在A = B-C中,首先评估B-C表达式。然后将结果复制到A. B-C表达式对A一无所知,因此无法直接更新A. 您可以重载赋值运算符,但这不会阻止创建新对象。
答案 3 :(得分:0)
一些提示:
首先,您没有指定如何初始化内部指针属性,所以此时它指向内存堆栈中未指定的值。
其次,operator-
方法(!)并未像您那样定义。 look at "binary arithmetic operators"
二元运算符必须返回对它们被调用的对象的引用。
第三,对象本身通过"自动" 传递给它的方法,并且它可用作this
指针。
所以你不要必须将它作为第一个参数传递。
最后,要返回引用,您必须返回值,而不是指针: - > *this
。
所以像A=B+C
这样的表达式被评估为:
A.operator=(B.operator+(C))
所以B + C与C + B不同。 (我不在这里输入继承的细节..)
受到上述the same previous link的启发:
class X {
int internalprivatevalue;
//....
public:
X& operator+(const X& second) {
// actual addition of second to *this takes place here
// e.g. internalprivatevalue+=second. internalprivatevalue;
return *this; // return the result by reference!!
}
}
希望能够澄清你的疑虑。