5

重複の可能性:
同じクラスのオブジェクトが互いのプライベート データにアクセスできるのはなぜですか?

カプセル化を維持しようとして、私が理解できなかった何か:

というクラスGameObjectと という派生クラスがあるとしHumanます。GameObjectにはプライベート変数がありますposition。の複数のインスタンスがありHuman、各人間が必要に応じてそのSetPos()位置を呼び出して設定できるようにしたいと考えています。しかし、私は一人の人間が別の人間の地位を設定する力を持つことを望んでいません. これは私の問題です。

私がSetPospublic または protected を持っている場合、各人間はお互いの位置を変更できますが、SetPos()private の場合、人間は自分の位置を設定することさえできません (これが必要です。弱い例かもしれませんが、理解していただければ幸いです)。

誰でも解決策を提供できますか?

ありがとう。

4

2 に答える 2

1

publicとprivateを使用したカプセル化は、別の問題、つまり、クラスを他のクラスから分離することでクラスのコーディングを容易にするという問題を解決することを目的としています。個々のオブジェクトを分離しません。

Perhaps you can restrict access by managing the pointers? Don't make pointers to objects generally available, but always go through an interface of some sort, identifying which object you want to use by a number or some other key?

于 2012-11-05T14:06:27.713 に答える
1

SetPos() が非公開の場合、人間は自分の位置を設定することさえできません

SetPosが で定義されている場合、実際には可能Humanです。メソッドはクラス内からのみ呼び出すことがprivateできますが、同じクラスのインスタンスを互いに保護しません。

class Human {
  private:
    void set_pos(int i) { std::cout << "moving to " << i << std::endl; }
  public:
    void set_pos_on_other(Human &other, int i) const { other.set_pos(i); }
};

int main()
{
    Human alice, bob;
    bob.set_pos_on_other(alice, 10);
}

SetPosが で定義されGameObjectていて、 によって呼び出される必要がある場合Humanは、それ自体でのみであっても、protectedまたはである必要がありますpublic

オブジェクトが互いのprivateメソッドを呼び出すという問題を解決するには、慎重にプログラミングし、不変条件に固執する必要があります。C++ には、このための特別な構文はありません。Humanメソッドが別の への参照またはポインタを渡されるときはいつでも、そのメソッドをHuman必要なだけ呼び出すことができHumanますprivate

于 2012-11-05T13:49:00.817 に答える