私は異常な状況にあり、
次のようなクラスがあるとします。
template <typename T>
class C
{
public :
C (int size) : value_(size), some_other_member_(size) {}
T &value () {return value_;}
const T &value() const {return value_;}
private :
T value_;
SomeOtherType some_other_member_;
};
クライアントが member にフル アクセスできるように設計されたクラスは、が参照を返すvalue_
ように、参照を返すことでクライアントにフル アクセスを与える必要があります。セッター/ゲッターのペアではうまくいきません。std::vector
operator[]
ただし、 とは異なりstd::vector
、クライアントがメンバーを完全に置換できるようにしたくありません。つまり、クライアントは のメンバーconst
または非const
メンバーを呼び出すことができるものとしますvalue_
が、次のことは許可されません。
C<SomeType> c(10);
SomeType another_value(5);
c.value() = another_value; // This shall not be allowed
クライアントに へのフル アクセスを許可する方法はありますかvalue_
。ある意味では、クラスC
はコンテナのようになりますが、含まれているものが初期化されると (コンストラクターを介して、 への要件がありますが、ここでは関係ありません)、クライアントは のメンバー関数を介してT
のみ変更でき、置換はできません。割り当てによって。value_
T
value_
ただし、T
コピー不可にする必要はありません。クラスC
はコピーできるからです。問題の核心は、クラスC
に見られるようにC
、いくつかのメンバーがあり、それらはすべてsize
プロパティを持ち、構築されると、それらはすべて同じで構築され、代入によって置き換えることが許可されているsize
場合、メンバーが同じプロパティvalue_
を持たなくなる可能性があるという意味で、データ構造が破損しています。size
サイズT
が同じ場合にのみコピーまたは割り当てを許可することもオプションではありません。オブジェクトをコピーすると、コピーC
元とコピー先でサイズが異なる可能性があるためです。例えば、
C c1(10);
C c2(20);
c1 = c2;
完全に合理的です。のサイズc1
が変更されますが、そのメンバーもすべて同じ新しいサイズに変更されるので、問題ありません。
問題を明確に述べたことを願っています。要約すると、基本的に必要なコンストラクターを持つ任意の型にすることができC
ますT
。コピーして割り当てることができます。クライアントに実行してほしくない唯一のことは、throughへの代入です。T
T
value_
C::value()