[英]How do overload an assignment operator that sums two instance variable of a class?
[英]how to overload assignment operator on class member variable
我正在嘗試跟蹤我將在 API 函數中輸入的變量的值。 一種選擇是重載賦值運算符並將一些代碼放在那里。 但是如何在類的成員變量上重載賦值運算符?
#include <iostream>
using namespace std;
template <class T>
class MonitoredVariable1
{
public:
MonitoredVariable1() { }
MonitoredVariable1(const T& value) : m_value(value) {}
operator T() const { return m_value; }
T val;
T& operator = (const T& value)
{
val = value;
m_value = value;
std::cout << "value updated" << " \n"; //THIS NEVER GET PRINTED!!!
return val;
}
private:
T m_value;
};
int main()
{
MonitoredVariable1<double> MonitoredVariable;
MonitoredVariable.val = 10.2;
std::cout << "main done..." << " \n";
return 0;
}
要監視對變量的更改,您需要分配給類,而不是包含的變量。
首先,擺脫val
。 只有私有m_value
值。 這樣,所有訪問都必須通過可以跟蹤更改的成員函數。
operator=
應該返回對類的引用( return *this;
),而不是值。
分配給類對象:
MonitoredVariable = 10.2;
您只能在類上重載賦值。 但是您可以將該變量設為具有重載賦值的類類型,例如:
class Monitor {
class Monitored {
double x;
public:
Monitored &operator= (double v) {
std::cout << "Assigned " << v << std::endl;
x = v;
return *this; // don’t forget this!
}
operator double() const {
std::cout << "Accessed " << x << std::endl;
return x;
}
};
Monitored val;
};
您可能需要重載更多運算符,並將對Monitor
的引用傳遞到val
(如果內存不足,可以使用一些技巧來計算它)。
您甚至可以(在現代 C++ 中)重載&
運算符,但除非 API 函數是模板,否則它必須返回指針。 通過它觀察訪問是非常特定於環境的。
在調試期間,您通常可以設置一個內存觀察點,該觀察點將在寫入或什至讀取特定內存位置時暫停程序執行(對於 GDB,請參閱 設置觀察點;VS 應該具有類似的功能)。 但是,這需要硬件支持(或速度非常慢的調試器-解釋器),因此觀察點的總數通常非常有限。
如果沒有調試器,您可以使用內存保護技巧(例如保護包含變量的頁面,並在第一個 SEGV 上取消保護)制作一次性手表,但這對於正常使用來說太脆弱了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.