【问题标题】:c++ about operator* overloadingc++关于operator*重载
【发布时间】:2014-02-16 18:10:12
【问题描述】:

是否有任何可能的方法来重载 operator*,使其分配和观察函数被分开定义?

class my_class
{
  private:
    int value;
  public:
    int& operator*(){return value;}
};

int main()
{
  my_class obj;
  int val = 56;

  *obj = val;   // assign
  val  = *obj;  // observe, same operator* is called
}

【问题讨论】:

  • 让它返回一个代理(如vector<bool>::iterator)。
  • 您定义的操作员不是您要调用的操作员。您定义的那个是二进制的。它有两个参数,左侧是my_class 对象,右侧是int。您尝试在main 中使用的那个是一元的。它只需要一个参数,就在它的右边。
  • @BenjaminLindley 哦.. 谢谢指点!

标签: c++ operator-overloading operator-keyword


【解决方案1】:

有点——你可以让 operator* 返回另一个类的实例,而不是直接返回一个引用。然后另一个类的实例定义了一个转换运算符和一个赋值运算符。

(在您的示例代码中,当您打算重载解引用运算符时,您似乎重载了乘法运算符;我将在下面使用解引用运算符。)

例如:

class my_class
{
   friend class my_class_ref;

public:
   my_class_ref operator*() { return my_class_ref(this); }

private:
   int value;
};

class my_class_ref
{
public:
   operator int() { return owner->value; } // "observe"
   my_class_ref& operator=(int new_value) { owner->value = new_value; return *this; } // "assign"

private:
   my_class* owner;

   my_class_ref(my_class* owner) { this->owner = owner; }
};

有一些警告。例如,由于 my_class_ref 是使用指向其父类的指针实现的,因此您的代码必须小心 my_class_ref 的生命周期总是比相应的 my_class 的生命周期短——否则您将取消引用无效指针。

在实践中,如果您假装 my_class_ref 不存在(即从不使用该类声明变量),它可以很好地工作。

【讨论】:

    【解决方案2】:

    这样写你的类

    class my_class
    {
      private:
        int value;
      public:
        int operator*() const { // observing
            return value;
        }
        int& operator*() { // assigning
            return value;
        }
    };
    

    然后这些操作符被 const 消除歧义,所以这样的代码是可能的

    int _tmain(int argc, _TCHAR* argv[])
    {
        my_class a;
        *a = 1; // assigning 
        int k = *(const_cast<my_class const&>(a)); // observing
        return 0;
    }
    

    【讨论】:

    • 是否可以在没有 const 强制转换的情况下进行观察?
    • 编译器选择this 指针是否为常量。它会更喜欢非常量版本。所以只有当你的对象已经是 const 时才有可能(例如 const 函数参数)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2012-05-03
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多