2011-08-02 18 views
1

私のプロジェクトでは、std::vectorのラッパーを作成しています。私は均質な座標を使用しているので、これをやっています。いくつかの操作では、一時的に4番目の座標を「忘れる」方が簡単です。関数呼び出し演算子と代入のオーバーロード

今私は問題につまずいた。次のような割り当てがあります。

Vector v; 
    v(0) = 5; 
    v(1) = 6; 

などがあります。私はまた、次の操作を実行したい:

double x; 
    x = v(0); 

その最後のもののために、私は()演算子をオーバーロードすることができますが、どのように最初のものを実装するのでしょうか? (0と1はインデックスです)。

+0

あなたのケースでは、 'std :: vector'を使う理由はほとんどないようです。その名前にもかかわらず、ジオメトリやコンピュータグラフィックスで使用されるベクトルとは何の関係もありません。 – jalf

答えて

5

参照を返します。

class Vector 
{ 
    int data[4]; 
    int & operator() (int index) { return data[index]; } 
}; 
+1

'const'オーバーロードを忘れないでください。 – templatetypedef

+0

ありがとう、私は1分前に​​それを発見しました。私はすべてを試したようだが、これを逃した。ああ、ありがとう! – KWyckmans

1

修正する要素に非const参照を返します。

1

二THINGS-

  1. それはここで、より自然な作業ですので、あなたはおそらく、むしろoperator()よりもこれを行うにはoperator[]をオーバーロードする必要があります。 operator()は関数オブジェクトの作成に使用され、operator[]は「この位置で要素を選択」を意味する演算子です。

  2. operator[]/operator()の結果への代入は、関数に書き込む値への参照を返させることで可能です。簡単な例として、ここでは生の配列をラップするクラスを表すいくつかのコードです:あなたはconst Arrayを持つことができますので、

ここ(コード:)

class Array { 
public: 
    int& operator[] (unsigned index); 
    int operator[] (unsigned index) const; 

private: 
    int array[137]; 
}; 

int& Array::operator[] (unsigned index) { 
    return array[index]; 
} 
int Array::operator[] (unsigned index) const { 
    return array[index]; 
} 

これらの関数の第二は、constオーバーロードです読み取り値を書き込みません。

+0

ええ、私がこのコードを書いていたとき、私はなぜ行列の[]の代わりに()を使うべきなのか、C++のfaqsliteの説明を考えていました。 – KWyckmans

1

標準ライブラリでは、operator()(実際には通常はoperator[])の戻り値タイプdouble &が実装されています。 doubleへの参照を返すことで、そのdoubleに参照を割り当てることができます。

ただし、これをstd::vectorの周りにラップしてもよろしいですか?このクラスは数学的な意味でのベクトルではありません。それはJavaのようなものですArrayList、小さな構造のためには全く効率的ではありません。通常は私自身のベクトルクラスを書くときには、たくさんのものを用意していますので、静的配列の上にゼロからクラスを実装します。

+0

ええ、あなたは有効なポイントを作っています。考えておく。 – KWyckmans

関連する問題