0

C++ での Operator のオーバーロードに問題があります。

次のクラスを定義しました。

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」のメモリへの永続化を回避するにはどうすればよいですか? 関数が終了し、VectorA=-VectorB のような代入が失敗すると、myNewArray は「静的」宣言なしで消えます。

2 番目の問題は、キャスト演算子のオーバーロードに関するものです。キャスト演算子を次のようにオーバーロードしました。

//!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 のような代入は失敗します。

エラーはどこにありますか? 誰もが解決策を提案できますか?前もって感謝します!

4

3 に答える 3

1

オペレーターは参照を返さないでください。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;
}
于 2012-09-02T22:17:34.690 に答える
0

「静的」宣言がないと、関数が終了するとmyNewArrayが消え、VectorA=-VectorBのような割り当てに失敗します。

いいえ、そうではありません。コンパイラーは、コピーされるのに十分な時間、ハングしていることを確認します。

また、myNewArrayを元のコピーとして初期化すると、コードが少しすっきりします。

Array<T> myNewArray(a);
for (int i = 0; i < myNewArray.size(); ++i)
    myNewArray[i] *= -1;
于 2012-09-02T22:17:00.710 に答える
-1

うーん、どちらの問題も新しい値を適切に代入できない不可解な失敗を伴うため、代入演算子に何か問題があるのでしょうか?

于 2012-09-02T22:21:07.977 に答える