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