2017-01-09 8 views
-4

Qはどのようにこの種類の演算子= で動作するのですか?operator = bout side 1つは値で、refrenceは2番目に?

int t = v [3]; //彼女の私は価値

によって返さ

V [3] = 8; //彼女は私が

意志Vは、Vectorクラス(私の場合はテンプレートクラス)

template <class T> 
T& Vector<T>::operator[](const int Index) const 
{ 
    if(Index > -1 && Index < this->Size) 
    { 
    return &this->Array[Index]; 
    } 
else 
    { 
     cerr <<"VECTOR_INVALID_INDEX"<<endl; 
     return NULL; 
    } 
}; 
+0

また、あなたが投稿したコードの問題点は何ですか? 'return NULL;'のコンパイルエラーですか?注:参照は 'NULL'と等しくはありません。 –

+2

これを処理する典型的な方法は、operator []のconstとnon-constのオーバーロードを使うことです:const T&Vector :: operator [](const int Index)const; '' T&Vector :: operator [] (const int Index); '。あなたは価値あるものを返す必要はありません。 'int t'のような新しい変数は、参照参照値と参照参照戻り値の両方にバインドすることができます。 – 0x5453

+1

参照はポインタではなく、その逆もあります。ヌル参照などはありません。 – molbdnilo

答えて

0

である。この例では、いくつかのエラーがあります([3] 'を追加Vへのポインタを)refrenceで返す必要があります。 thisはすでにポインタです。 &thisを実行することは、あなたがここで行うことを意味するものではありません。あなたが持っている他の問題は、あなたがTへの参照を返すことですが、thisは、この文脈でのconstです。​​はT&にバインドすることはできませんconst Tです。 constを追加して、代わりにconst T&を返してください。第3に、this->Sizeはメソッドのサイズを呼び出さず、かっこを忘れています。 4番目の問題は、NULLへの参照バインディングです。別の方法を決定する必要があります。操作が完了できないことを示す通常の方法は、例外をスローすることです。 std::vector::atは、ヘッダstdexceptからstd::out_of_rangeをスローします。

template <class T> 
const T& Vector<T>::operator[](const int Index) const 
//^^^ add const here 
{ 
    if (Index > -1 && Index < this->Size()) 
    //     Add parentheses ^^ 
    { 
     return this->Array[Index]; 
     // ^No need for & 
    } 
    else 
    { 
     throw std::out_of_range("VECTOR_INVALID_INDEX"); 
    } 
}; 

あなたはおそらくこれが例v[3] = 8;のために失敗することから、同様に非constバージョンを追加することになるでしょう。

T& Vector<T>::operator[](const int Index); 
+0

_fixed_演算子のオーバーロードにはコンパイルエラーがあります。参照を返すメソッドから 'return NULL;'が返されます。 –

+0

返り値nullは、数値が-1以上であれば、それは確かにそれを知っているスタックにありがとう!!!! –

+0

これをどのように動作させるか:T \t operator =(const T * Element); 2人のオペレーターがうまく動作しますか? –

関連する問題