我想设计一个公共(public)接口(interface),它有一个方法,可以让我将两个具有这个接口(interface)的对象相乘,并返回一个与结果相同类的新对象。为了简单起见,我将只关注实现此接口(interface)的一个类。 问题:我的问题是返回的对象。 让我们看看:
拥有界面之前的目标:
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;
};
在这种情况下,我不能为 operator* 方法使用返回类型 I(按值),因为 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;
};
这里的问题是我要返回对局部变量的引用。
如何在不使用动态分配的情况下以正确的方式做到这一点?
提前致谢。
最佳答案
如果不使用动态分配,您将无法以这种多态方式执行此操作。
你确定乘法在多态方面真的有意义吗?如果是这样,您将不得不返回一个动态分配的指针并管理其生命周期(可能使用智能指针)。但在这种情况下,它不符合正常语义 if operator*
,因此您可能应该创建一个特殊函数来完成这项工作。
另请注意,您有一些不是 C++ 惯用的怪癖。 get
应该是一个 const 方法,你的 operator*
的参数应该是 const 引用或值(没有人希望 operator*
修改一个它的操作数,因为这违反了最小惊奇原则)。通常 operator*
按值返回其结果,以防止在运算符未按值返回时混淆谁拥有任何已分配的返回内存。
关于C++ 返回一个对象抛出一个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6651505/