2016-11-25 17 views
7

Iクラスを実装する必要が多次元ベクトルの座標を設定し、(私はこの部分を変更することはできません)、この特定のコードで呼び出されたときに動作するベクトル複数のドット演算子(C++クラス)

const int NumOfDimensions = 5; 
    Vector x (NumOfDimensions); 
    x.Set(0, 1.1).Set(1, 1.2).Set(2, 1.3).Set(3, 1.4).Set(4, 1.5); 
    x.print(); 

と出力は次のようにする必要があり:

(1.1、1.2、1.3、1.4、1.5)

これは何ですか私が試したが、それは仕事を得ることができませんでした:

class Vector { 
float *coordinates; 
int dimensions; 

public: 
Vector(int k) 
{ 
coordinates = new float[k]; 
dimensions = k; 
} 
void Set(int k, float wsp) 
{ 
    //Vector x(k+1); 
    coordinates[k] = wsp; 
    //return x; 
} 
void print() 
{ 
    int i; 
    cout<<"("; 
    for(i=0; i<dimensions; i++) 
    cout<<coordinates[i]<<", "; 
    cout<<")"<<endl; 
} 
}; 

は、だから私は変更する必要が機能設定を知っているし、おそらくオブジェクトを返しますが、私はさまざまな方法の多くを試してみましたが、それだけでは動作しません。どのように修正する必要がありますか?

答えて

12

あなたが参照を返す必要があり、その種の連鎖法にできるようにしたい場合:

Vector& Set(int k, float wsp) { 
    // ... 

    return *this; 
} 

私はあなたは、Python、Rubyのような他の言語ではその多くを見ていてもすることを主張したいですそのようなインターフェイスはあまりC++ではありません。

coordinatesを保存するにはstd::vectorを使用する方が良いでしょう.Cスタイルのアレイは何の問題もありません。あなたがdelete[]で割り振り解除しないので、このコードは実際に深刻なメモリリークを持っています。デストラクタは定義されていません。標準ライブラリコンテナを使用すると、その責任が軽減されます。

あなたは、これはより多くのネイティブC++は、あなたは、単に代わりに、あなたのためにそれをしないprintと呼ばれる不格好なメソッドを持つの直接coutにこれをダンプすることができますので、それのためのフォーマッタを定義することであることを確認するために行うことができますもう一つ:

std::ostream& operator<<(std::ostream& stream, const Vector& vec); 

これは、coutだけでなく、すべてのストリームでそのフォーマッタを使用できるようにします。

+0

ありがとうございました!それはうまくいく、私はこのために2時間を無駄にし、1分後にここで答えを得たと信じていない。 – mushisgosu

+0

C++で使用するのは珍しいパターンです。おそらくそれほど多くの呼び出しがないと思われます。 – tadman

+1

@mushisgosu答えがあなたの問題を解決した場合は、それを合格とマークする必要があります。 –