簡體   English   中英

C ++重載運算符=指針無法正常工作/編譯

[英]C++ Overload Operator = for Pointers does not work/compile properly

我正在嘗試使用=的操作符重載實現模板類,到目前為止,它適用於非指針元素。 對於Pointer Elements,它不能完全按我的預期工作,所以我的問題是為什么要播種,以及如何強制c ++按我的意願去做。

我的模板類:

template <class T>
class IBag {
public:
    T _val;
    void Set(T val) { _val = val; } 
    T Get() { return _val; }

    IBag& operator=(T val) {
        this->Set(val);
        return *this;
    }

    operator T() {
        return this->Get();
    }
};

使用IBag類的工作方式:

class IBagExample
{
   void showExample() {
        IBag<QString*> pbag;
        pbag = new QString("Blub"); // This works !
    }
};

如何不編譯:

class IBagExample
{
   void showExample() {
        IBag<QString*> pbag = new QString("Blub"); // This doesn't compile !
    }
};

我得到的編譯器錯誤是:

error: no viable conversion from 'QString *' to 'IBag<QString *>'
    IBag<QString*> pbag2 = new QString("Blub");
                   ^       ~~~~~~~~~~~~~~~~~~~

對我來說似乎是一樣的,也許我需要告訴編譯器一些東西,以了解現在將哪種類型的指針推入pbag中。 但是我不知道該怎么做。

使用像這樣的運算符重載

IBag<QString*> pbag; pbag = new QString("Blub"); // This does compile !

似乎很荒謬。

(注意:IBag示例只是我嘗試實現的代碼的簡化。)

非常感謝,

IBag<QString*> pbag = new QString("Blub");

這實際上並沒有調用賦值運算符,而是調用了構造函數。 您需要定義如下內容:

template <class T>
class IBag {
public:
    IBag( const IBag& rhs )
    {
        // ....
    }

};

要么:

    IBag( const T& rhs )
    {
        // ....
    }

分配不是建設。 復制賦值運算符不處理工程(即使=在分配中看上去非常像=與拷貝初始化的聲明)。 定義合適的構造函數或使用C ++ 11大括號初始化,例如

auto pbag2 = IBag<QString*>{ new QString("Blub") };

免責聲明:編譯器不動的代碼。


代碼有問題:

  • 設置器和獲取器通常具有設計味,是Java風格的,即使有時有用,

  • 公共數據成員也是具有不變性(例如非空指針)的類的設計氣味,

  • 一個帶有setter和getter的公共數據成員,這沒有意義,

  • 您需要負責復制(三個規則,零規則),並且

  • 您需要就支持constness做出決定,然后進行“正確的事情”(無論如何)。


對於這樣的邏輯接口,還可以考慮添加虛擬析構函數。 通過接口啟用RTTI。 例如,通過接口刪除對象,或動態轉換為其他某個接口或實現類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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