2017-08-03 9 views
1

構造体のベクトルを含む類似の構造を持つ2つのクラス(A & B)があります。他のクラスの複数のオブジェクトのプライベートメンバーベクトルにアクセス

class A/B{ 
private: std::vector<DataStruct> vec_A/vec_B; 
... 
public: 
... 
} 

Bのオブジェクトを更新/作成するには、私は、オブジェクトBのベクトルに1つのエントリにベクターに同様のエントリを組み合わせる(クラスAの複数のオブジェクトのベクトルからのデータを組み合わせてデータを行う必要がB)における変換。

どうすればよいですか? A.の友人

  • メイキングクラスBしかし、私はC++のクラスの友達を作ることは最後であり、避けるべきであること、聞いた:

    私の考えでした。

  • ベクトルvec_Aへの参照を返すクラスAにgetVector()関数を記述すると、クラスBはデータに対して操作できます。私にとっては、これは単にデータのカプセル化をバイパスするようです。ベクターを公開することのメリットは何ですか?
  • vec_Aのコピーを返す、クラスAにgetVector()関数を記述する。しかし、vec_Aはそれほど小さくはないので、これは非効率的であるようです(大丈夫ですが、ほんの数KBです。)
  • 計算を行い、クラスのオブジェクトを作成するクラスAの関数を記述しますB.その後、Bの複数のオブジェクトをBの1つの最終オブジェクトに連結します。しかし、これは私にとって大きなオーバーヘッドのようです。そのクラスBがデータを操作できるように、Vector vec_Aを参照 を返すクラスAにおけるgetVector()機能を、書き込み
+1

Bにconst参照の 'vec_A'を与えることを考えましたか? – Xatyrian

+0

@Xatyrianいいえ、これは良いアイデアのようです – Jounathaen

答えて

1

。私にとっては これは単にデータのカプセル化をバイパスするようです。ベクトルをパブリックに設定することのメリットは、 でしょうか?

Bはちょうど、vec_Aの内容を観察const参照(const &)の復帰を検討する必要がある場合:私はちょうど、ベクトルデータメンバを公開することには、このソリューションを好む

class A { 
... 
    public: 

    // Give read-only access to vec_A 
    const std::vector<DataStruct> & getVector() const { 
     return vec_A; 
    } 
}; 

を:アクセサに(ゲッター/セッター)あなたはより良いコントロールを持っています。たとえば、上記のような読み取り専用アクセスを実装することができます。あるいは、セッターを提供したい場合は、入力引数などのチェックを実装することもできます。

関連する問題