[英]Overloading Operators in C++ with a Template
我在C ++中遇到運算符重載的問題。
我定義了以下類:
template <class T>
class Array
{
public:
//! Default constructor
Array(int ArraySize = 10);
////! Defualt destructor
Array<T>::~Array();
//! Redefinition of the subscript operator
T& Array<T>::operator[] (int index);
//! Redefinition of the assignment operator
const Array<T>& Array<T>::operator=(const Array<T>&);
//! Redefinition of the unary operator -
Array<T>& operator-(Array<T>& a);
//! Array length
int size;
private:
//! Array pointer
T *ptr;
};
一元運算符-定義如下:
//! Redefinition of the unary operator -
template<class T>
Array<T>& operator-(Array<T>& a){
static Array<T> myNewArray(a.size);
for( int i = 0; i < a.size; i++){
myNewArray[i]=-a[i];
}
return myNewArray;
}
如何避免“ myNewArray”的內存持久化? 函數結束時,Whitout的“靜態”聲明myNewArray消失並且使任何賦值失敗,例如VectorA = -VectorB。
第二個問題是關於鑄造操作員的超負荷。 我以這種方式使轉換運算符超載:
//!CASTING
template <class B>
operator Array<B>(){
static Array<B> myNewArray(size);
.... a function makes the conversion and returns myNewArray populated...
return myNewArray;
}
但這不起作用! 使用靜態聲明的函數執行后,對象myNewArray似乎也消失了。 任何類似VectorA =(Array <'anytype'>)VectorB的賦值都會失敗。
錯誤在哪里? 可以請大家提出解決方案嗎? 先感謝您!
對於您的運營商,請不要返回參考。 返回myNewArray的副本。 大多數編譯器都可以刪除副本並使用返回值優化來使性能令人滿意。
您還應將這些方法標記為const,因為它們不會更改狀態。
template<class T>
Array<T> operator-(const Array<T>& a) {
Array<T> myNewArray(a.size);
for( int i = 0; i < a.size; i++){
myNewArray[i]=-a[i];
}
return myNewArray;
}
如果沒有“靜態”聲明,則myNewArray將在函數結束時消失,並且使任何賦值失敗,例如VectorA = -VectorB。
不,不是。 編譯器確保將其掛起足夠長的時間以進行復制。
此外,該代碼會有點清潔劑,如果你初始化myNewArray的原件及復印件:
Array<T> myNewArray(a);
for (int i = 0; i < myNewArray.size(); ++i)
myNewArray[i] *= -1;
嗯,由於這兩個問題都涉及到無法正確分配新值的神秘失敗,因此賦值運算符中是否有問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.