C++ 返回一个对象抛出一个接口(interface)

标签 c++ interface return-value-optimization

我想设计一个公共(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/

相关文章:

c++ - 如何确定两个字符串是否同构?

c++ - 什么是复制省略和返回值优化?

c++ - 什么是复制省略和返回值优化?

c++ - 返回时交换 STL?

postgresql - 如何在没有 matlabs 数据库工具箱的情况下从 matlab 访问 postgresql 数据库?

java - Java 中的 “sealed interface” 有什么意义?

c++ - 将 NSValue 解码为 b2fixture 时的 EXC_BAD_ACCESS

c++ - 阐明 C/C++ 中的悬挂指针

c++ - 在 soap_ssl_server_context(...) 中使用继承时 gsoap 中的段错误

Java - can-do 接口(interface)的命名约定,而不是 can-be-done-to