簡體   English   中英

使用模板在C ++中重載運算符

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

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