2 つの異なる静的変数を宣言するにはどうすればよいですか?(C++)
-
14-09-2019 - |
質問
編集:プライベートと宣言したのはタイプミスだったので、修正しました。
別の質問に関連して、クラスで静的変数を宣言し、そこからクラスを派生した場合、静的変数をクラスごとに個別に宣言する方法はありますか。つまり:
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'
};
所属していません StackOverflow