質問

編集:プライベートと宣言したのはタイプミスだったので、修正しました。

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

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

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

役に立ちましたか?

解決

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

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

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

更新しました C++ 構文を使用します。

他のヒント

これは、2つの別々の静的変数を作成します。

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

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

変数が互いに競争していないことを意味します。

既に述べたように、それは、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

誰かが、アクセシビリティは、アクセシビリティを制限するかもしれないと述べた:ベース変数のプライベートが子クラスにそれにアクセスすることはありません作ります。 変数が保護または公衆されるようにしている場合は、明示的なアクセス方法を使用するか、私はちょうど立証ローカルスコープルールに依存しています。

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

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'
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top