是否有任何可能的方法来重载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
}
答案 0 :(得分:1)
排序 - 您可以让运算符*返回另一个类的实例,而不是直接返回引用。然后,另一个类的实例定义转换运算符和赋值运算符。
(在您的示例代码中,当您想要重新引用解除引用操作符时,看起来您已经重载了乘法运算符;我将使用下面的解除引用运算符。)
例如:
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不存在(即从不用该类声明变量),它可以很好地工作。
答案 1 :(得分:0)
像这样写你的课
class my_class
{
private:
int value;
public:
int operator*() const { // observing
return value;
}
int& operator*() { // assigning
return value;
}
};
然后这些运算符被constness消除歧义,所以这样的代码是可能的
int _tmain(int argc, _TCHAR* argv[])
{
my_class a;
*a = 1; // assigning
int k = *(const_cast<my_class const&>(a)); // observing
return 0;
}