0

2 つの質問があります。まず、C++ はクラス レベルのデータ カプセル化のみを提供することを理解しています。つまり、同じクラスのすべてのオブジェクトが互いのプライベート メンバーにアクセスできるということです。この理由は理解していますが、いくつかのリンクを見つけました (つまり、http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an- instance-variable/ ) は、この点と矛盾しているように見え、次のことができることを示唆しています。

class testclass {
  private:

  // Below would be an instance-level variable, and new memory for it is set aside 
  // in each object I create of class testclass 
  int x;

  // Below would be a class-level variable, memory is set aside only once no matter 
  // how many objects of the same class 
  static int y;
}

私がやりたいことは、実際にこれを機能させることです。つまり、各インスタンス化でプライベートなクラスに変数を定義したいと思います(これは私の 2 番目の質問です)。上記のコード スニペットはこれを達成していないように見えるため、個々のオブジェクトにプライベートなデータを作成するために使用できる回避策はありますか? ありがとうございました!

編集:

確かに、私はまだ OO の基礎を学んでいます。どこにでもある車の例を使って、私がやろうとしていることを示します。それを再考する方法についての提案を歓迎します:

class car {
  private:
    int mileage;
  public:
    car(int); // Constructor
    void odometer();
};

car::car(int m) {
  mileage = m;
}

void car::odometer() {
  return mileage;
}

int main(void) {
  car ford(10000), honda(20000);

  cout<<ford.odometer(); //Returns 20000, since honda constructor overwrites private variable 'mileage'
}

私が望むものに応じて、フォードまたはホンダの走行距離を返すために odometer() メソッドを取得する方法はありますか?

4

1 に答える 1

1

特権 (公開、非公開、保護) は名前にのみ適用されます。名前が解決される間のみ、コンパイラはアクセス許可を適用します。コンパイルされると、そのような情報はすべてなくなります。

上記の例では、これらの変数に解決されるスコープ内の名前 x および y のすべての使用は、クラスに対してプライベートになります。static かどうかに関係なく、クラスで宣言された関数のみが、これらの変数に nameでアクセスできます。

ただし、他の権限を持つ他の名前で変数を参照できる他のオブジェクトに変数を渡すと、すべての賭けはオフになります。

「インスタンス化ごとに」に関してあなたが何を求めているのかわかりません。私の知る限り、そのインスタンスだけがアクセスできるように変数をプライベートにするネイティブな方法はありません。いずれの場合も、インスタンスは互いのプライベート パーツにアクセスできます。

これを回避する方法はいくつかあると思います。まず、クラスをテンプレート化し、各インスタンスに異なる型を与えます。これは、整数のテンプレート パラメータなどを使用して行うことができます。ただし、これらのタイプを同じ種類のものとして操作しようとすると、これは人生を煩わしくする可能性があります。仮想化して、抽象基本クラスなどを用意する必要があります。

現在、私が考えることができる唯一の方法です。他のすべては、通話エンティティが適切に機能することに依存しています。

一般的に言えば、メンバーを他のインスタンスから保護する必要はほとんどありません。同じ型が同じ型に渡される通常のケースは、コピーと代入の間です。基本的に、正しくコピーするには、ソースに関するすべての知識が必要です。私の賭けは、あなたが何をしようとしているのか、それが何であれ、再考する必要があるということです.

于 2013-03-07T17:20:13.040 に答える