2009-06-15 14 views
1

EDIT:彼らはプライベート宣言はタイプミスでした、私はそれを修正:2つの異なる静的変数を宣言するにはどうすればいいですか? (C++)

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

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

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

+0

lol私は、この質問が、私たちよりも速く、早くコンパイラによって返答されていると思いました – kizzx2

+0

コンパイラはありませんか? – ralphtheninja

答えて

2

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

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

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

+1

これはJavaの構文です。 C++で同じ種類の明示的な参照を行うには、スコープ演算子を使用する必要があります。 B :: x –

+0

良い点。私はC#/ Javaの土地で考えていました。 – StriplingWarrior

+0

まあ、周辺のコードの残りの部分はまだ法的なC + +ではありませんが、彼は十分にC + +に精通していると仮定して質問者が翻訳することができると思います。 :) –

1

これは、2つの独立した静的変数を作成します。あなたは暗黙的にこれらのプライベートを宣言した

0

注:

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

変数を意味し、相互に競争していません。あなたがより多くなるまで、あなたが、唯一の近い範囲の定義が使用されるBの方法では、単に「x」を使用しようとすると実際には

A::x; 

// and 

B::x; 

0

としてはすでに二つの別々の変数を作成している、と述べました精密:

#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 

アクセシビリティ:基本変数をprivateにすることで、子クラスにアクセスできなくなります。 ただし、変数を保護またはパブリックにする必要がある場合は、明示的なアクセス方法を使用するか、今説明したローカルスコープのルールに頼ってください。あなたは静的変数を使用している場合は、明示的に言及するのは良い考えかもしれません

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' 
}; 
関連する問題