簡體   English   中英

如何重載類成員變量上的賦值運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM