【发布时间】:2011-07-11 14:18:11
【问题描述】:
我想设计一个通用接口,它有一个方法,可以让我将两个具有该接口的对象相乘,返回一个与结果相同的类的新对象。为了简单起见,我将只关注实现此接口的一个类。 问题:我的问题是返回的对象。 让我们看看:
拥有接口之前的目标:
class C {
public:
int get() { return v; }
void set(int value) { v = value; }
C operator * (C &l) {
C r;
r.set(get() * l.get());
return r;
}
private:
int v;
};
在这种情况下,operator* 方法返回一个 C 类型的对象,而不是一个引用(记住这一点)。它利用了返回值优化。 现在,让我们来解决问题: 在这种情况下我想设计一个界面:
struct I {
virtual int get() = 0;
virtual void set(int value) = 0;
virtual I& operator * (I &l) = 0;
};
在这种情况下,我不能将返回的类型 I(按值)用于 operator* 方法,因为 I 是抽象的。好的,我们来解决问题:
class C : public I {
public:
int get() { return v; }
void set(int value) { v = value; }
I& operator * (I &l) {
C r;
r.set(get() * l.get());
return r; // warning: reference to local variable ‘r’ returned
}
private:
int v;
};
这里的问题是我正在返回对局部变量的引用。
如何在不使用动态分配的情况下以正确的方式做到这一点?
提前致谢。
【问题讨论】:
-
实际上您的第一个示例没有利用返回值优化 (RVO)。如果您的编译器能够进行命名返回值优化 (NRVO),那么在这种情况下可能会这样做。
return C(get() * l.get());出了什么问题? -
这个乘法运算符不是一个好主意。它不是可交换的。
标签: c++ interface return-value-optimization