【发布时间】:2014-02-22 02:50:06
【问题描述】:
我正在构建一个具有略微不对称添加的类。在投诉出现之前,它必然是不对称的。当两个对象相加时,必须进行转换(需要一些时间的操作),并且转换最自然地发生在正确的加法上。
为了具体说明,这里有一个通用的例子来说明正在发生的事情......
class Foo {
char _fav;
int _prop;
public:
const char fav() const {return _fav;}
const int prop() const (return _prop;}
void changeFav(char); // complicated method that also changes _prop
void changeProp(int); // straightforward method
}
Foo
operator + (Foo A, Foo B) {
Foo sum;
if (A.fav() != B.fav()) A.changeFav(B.fav);
sum.changeProp(A.prop() + B.prop());
return sum;
}
为了添加两个Foo,它们需要具有相同的_fav,因此必须选择要转换的_fav。根据Foo的详细信息,最自然的是将左和数改为右和数。
但是,当这样做时:
Foo A,B,C;
Foo D = A + B + C; // D = (A + B) + C
Foo E = A + (B + C);
如果A 已经拥有与C 相同的_fav,则changeFav 会为D 调用两次(一次将A._fav 更改为B._fav,然后再次将(A+B)._fav 更改为C._fav)和一次E(将B._fav更改为C._fav)。我更喜欢后者,但希望避免强迫用户使用括号进行多次添加。
有没有办法重载operator + 的关联性来实现这一点?
【问题讨论】:
-
您的
operator+没有返回任何内容,并且两个成员函数缺少返回类型。 -
无法提供完整的答案,但简而言之,不要返回 foo 并使正确的操作数不是 foo。这只是我亲爱的打出的意识流。
-
@PengOne:我们通常希望您的代码至少是有效的 C++。 :)
-
@PengOne:是的,一直都是。当您编写包含错误的伪代码时,我们无法保证您的问题就是您要问的问题。确保您记得编写返回类型和返回语句很容易,所以是的,我们要求您这样做。
-
不改变关联性只是为了解决这个例子?你可以想出一个场景,左关联会比右关联产生更快的代码,反之亦然。为什么不应该只是一个可变参数
Foo sum(Foos...)函数并在那里实现它?
标签: c++ operator-overloading associative