[英]c++ about operator* overloading
是否有任何可能的方式可以重载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
}
有点-您可以让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不存在(即永远不要在该类中声明变量),则可以很好地工作。
像这样写你的课
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.