1

編集:それらを非公開と宣言するのはタイプミスでした。修正しました:

別の質問に関連して、クラスで静的変数を宣言し、そこからクラスを派生させた場合、静的変数をクラスごとに個別に宣言する方法はありますか。すなわち:

class A:
{
public:
static int x;
};
class B:A
{
public:
const static int x;
};

xA 用と B 用の 2 つの異なる静的変数を定義しますか?それとも、再定義するとエラーが発生xしますか?エラーが発生した場合、2 つの別々の静的変数を作成するにはどうすればよいですか?

4

5 に答える 5

2

静的変数を使用している場合は、それらを明示的に参照することをお勧めします。

public class B:A
{
  public const static int x;
  public int foo()
  {
    return B::x;
  }
}

そうすれば、階層内のクラスの「上」に同じ名前のメンバーを作成することを決定した場合でも、コードが破損することはありません。this同様に、私は通常、通常のメンバーフィールドにアクセスするときにキーワードを使用しようとします。

C++構文を使用するように更新されました。

于 2009-06-15T21:10:57.643 に答える
1

これにより、2 つの個別の静的変数が作成されます。

于 2009-06-15T20:52:08.093 に答える
0

Aを使用する各クラスに個別の静的変数が必要な場合は、テンプレートクラスを使用できます。
例えば

template<class T> struct A
{
   A() { ++s_var; }
   static int s_var;
};

template<class T> int A<T>::s_var;

stuct B :A<B> {
  B() { ++s_var; }  // this is a different s_var than the one used by 'C' below
};

struct C : A<C> {
  C() { ++s_var; } // this is a different s_var than the one used by 'B'
};
于 2009-06-15T21:12:34.223 に答える
0

これらのプライベートを暗黙的に宣言していることに注意してください。

class A:
{
  private:
  static int x;
};
class B:A
{
  private:
  const static int x;
};

つまり、変数は互いに競合していません。

于 2009-06-15T20:59:21.010 に答える
0

すでに述べたように、これにより 2 つの個別の変数が作成されます。

A::x;

// and 

B::x;

実際、B のメソッドで「x」だけを使用しようとすると、より正確になるまで、より近いスコープ定義のみが使用されます。

#include <iostream>

class A
{
protected:
static int x;

public:
    A() { x = 7; }
};

int A::x = 22;

class B:A
{
static const int x = 42;

public:

    int a_x() const { return A::x; }
    int b_x() const { return B::x; }
    int my_x() const { return x; } // here we get the more local variable, that is B::x.
};

int main()
{
    B b;

    std::cout << "A::x = " << b.a_x() << std::endl;
    std::cout << "B::x = " << b.b_x() << std::endl;
    std::cout << "b's x = " << b.my_x() << std::endl;

    std::cin.ignore();
    return 0;
}

出力:

A::x = 7
B::x = 42
b's x = 42

アクセシビリティによってアクセシビリティが制限される可能性があると誰かが言いました。基本変数をプライベートにしても、子クラスからアクセスできるようにはなりません。ただし、変数を保護またはパブリックにする必要がある場合は、明示的なアクセス メソッドを使用するか、先ほど説明したローカル スコープ ルールに依存します。

于 2009-06-15T21:04:50.827 に答える