2017-08-09 7 views
1

コンテナクラスを作成し、それがどのように動作し、どのように使用できるかを知るために、ポインタと組み合わせてnewキーワードを使用しました。演算子のオーバーロードと設定値

template<typename T> 
class Container { 
private: 
    T value; 
public: 
    Container(T value) { 
     this->value = value; 
    } 
    Container() { 

    } 
    virtual ~Container() { 

    } 
    T getValue() { 
     return value; 
    } 
    void setValue(T value) { 
     this->value = value; 
    } 
    void operator[](T value) { 
     this->value = value; 
    } 
}; 

int main() { 

    std::vector<Container<int>*> arr(10); 
    for (int i = 0; i < 10; i++) { 
     Container<int> *a = new Container<int>; 
     a->setValue(i); 
//  a[i]; 
     arr[i] = a; 
     std::cout << arr[i]->getValue() << std::endl; 
     delete a; 
    } 

    return 0; 
} 

[]オペレータはsetValue()と同じコードを有しているが、私はa->setValue(i)を使用し、a[i]を使用してそれだけで乱数を印刷する場合にのみ0から9までの数字を印刷します。どうして?

+1

私はあなたが読んでお勧めします[この標準的な実装の参照](http://en.cppreference.com/ w/cpp/language/operators#Canonical_implementations)を使用します。あなたの[配列添字演算子オーバーロード](http://en.cppreference.com/w/cpp/language/operators#Array_subscript_operator)は間違っています。 –

+1

添え字演算子は、そのパラメータとしてインデックスを取り、割り当てが更新する参照を返す必要があります。 – Barmar

答えて

3
  1. Sly_TheKing's answer(ポインタへのインデックス演算子の適用)を参照してください。
  2. インデックス演算子は、特定のオフセットの値にアクセスするためのものです。符号付きまたは符号なし整数値を受け入れ、特定の値を返す必要があります。だから、オペレータは、有効であるために、次のようになります。 実際
T& operator[](size_t index) 
{ 
    return value; 
} 

、あなたはあなたにインデックスを適用できる何かを持っていないので(あなたのケースでのみ有効なインデックスが0 –かだろう別の観点からすると、任意のインデックスは同じ値を返すので、& a [0] == & a [1]が適用されます - 構文的には正しいかもしれませんが、インデックス演算子のセマンティクスには違反します。 。)、逆参照演算子がより適切になります。

T& operator*() { return value; } 
T& operator->() { return value; } 

おそらく、あなたは(のsetValueに代わる)すぎ、代入演算子を追加することができます。

Container& operator=(T const& value) { this->value = value; return *this; } 
+0

私はそれを に変更しました。void operator =(T const&value){this-> value = value; }それはコンテナ&戻り値として、より正確に正しい、まだ正しいですか? – Phil

+0

彼はクラス 'container'の' operator [] 'に全くアクセスしていません。問題はありません。 –

+0

@Sly_TheKing彼は質問でそれをコメントしました - そして、それを使用するとゴミについて質問する... – Aconcagua

1
ラインで

Container<int> *a = new Container<int>; 

この行とそう

a[i]; 
あなたは、ポインタとして aを初期化します

あなたはちょうどaとオフセットi * sizeof(container<int>)

に格納されたアドレスでいくつかのメモリにアクセスします

だから、正しい使い方はあなたがあなたのクラスで書いたoperator[]にアクセス

(*a)[i];
std::vector<Container<int>*> arr(10); 
for (int i = 0; i < 10; i++) { 
    Container<int> *a = new Container<int>; 

    (*a)[i]; 
    arr[i] = a; 
    std::cout << arr[i]->getValue() << std::endl; 
    delete a; 
} 

だろう

関連する問題