2

クラス内のプライベート変数の参照による受け渡しは、そのクラスの外部で直接変更することができますか?それとも、これはコンパイラーが「拾い上げて防ぐべき」ものですか?

例:

//-------------------------------------------
class Others
{
public:
 Others() {};
 void ChangeIt(string &str) { str = "Changed by Others"; }
};

//-------------------------------------------
class Locals
{
private:
 string PrivateString;
public:
 Locals() { PrivateString = "Set by Locals"; };
 void VisitOthers() { Others o; o.ChangeIt(PrivateString); }
 const string GetString() { return PrivateString; }
};

//-------------------------------------------
int main(void)
{
 Locals lo;
 cout << lo.GetString() << "\n";
 lo.VisitOthers();
 cout << lo.GetString() << "\n";
 return 0;
}

出力:

Set by Locals
Changed by Others

所有者クラスにプライベートであるが、必要に応じて他の人が変更できる、他の/異なるオブジェクトを使用して、このようなことを行う必要があります。私が最後に望んでいるのは、この種の練習が戻ってきて、将来私をバイトすることです。

私が本質的に心配しているのは、クラス/構造体を基本的にバッファーへのポインターとして表示し、メンバーのアドレスをこのバッファーへのオフセットとして表示したいので、メンバーのポインター値を渡してもそれが属するクラス/構造体のベースポインタなしでは役に立たない。これは私が本能的にそうあるべきだと感じていることであり、上記の例は不可能であるはずです。

4

4 に答える 4

5

防ぐことは何もありません、あなたは参照によってあなたのプライベートメンバーを渡します。呼び出している関数はプライベートメンバーにアクセスしていません。それ自体の引数を変更しています(これはたまたまあるクラスのメンバーです)。コードは問題ありませんが、重要なことは、呼び出した関数がプライベートメンバーへの参照を保持しないことです。

于 2010-09-18T08:25:50.137 に答える
2

クラスの設計者として、C ++は、クラスのプライベートメンバーへの参照をだれにでも配布することを妨げません。ただし、そのようなアクセスを許可されたエンティティ(友人など)のみに制限することをお勧めします。その場合、そのようなプライベートメンバーへのアクセスは、「設計による」ため、実際には大きな問題にはなりません。

編集2:

のクラスの変更バージョンはoperator[]、通常、外部エンティティがプライベートメンバーを変更するためのインターフェイスも提供します。

于 2010-09-18T08:28:32.143 に答える
1

これは良い習慣ではありません。他のオブジェクトにオブジェクトを変更させたい場合は、

フレンドクラスとフレンド関数

于 2010-09-18T08:30:03.663 に答える
1

プライベートメンバーを渡すことは完全に大丈夫です。constメソッドにすることで、VisitOthers()がオブジェクトを変更しないことを示します。メソッドが次の場合:

void VisitOthers() const {Other o; o.visit(PrivateString);}

PrivateStringをconstオブジェクトとしてのみ渡すことが許可されるため、コンパイラエラーが発生します。ただし、constとコメントによって、どのメソッドが実際にオブジェクトの状態を変更するかを示すことが非常に重要です。

于 2010-09-18T08:44:10.207 に答える