두 가지 다른 정적 변수를 선언하는 방법은 무엇입니까? (C ++)
-
14-09-2019 - |
문제
편집 : 비공개로 선언하는 것은 오타라고 생각합니다.
다른 질문과 관련하여, 클래스에서 정적 변수를 선언 한 다음 클래스를 도출 한 경우 각 클래스 당 정적 변수를 개별적으로 선언 할 수있는 방법이 있습니까? 즉:
class A:
{
public:
static int x;
};
class B:A
{
public:
const static int x;
};
두 가지 다른 정적 변수를 정의합니까? x
, 하나는 A와 B에 하나 또는 재정의에 오류가 발생합니다. x
, 그리고 오류가 발생하면 두 개의 별도의 정적 변수를 어떻게 생성합니까?
해결책
정적 변수를 사용하는 경우 명시 적으로 언급하는 것이 좋습니다.
public class B:A
{
public const static int x;
public int foo()
{
return B::x;
}
}
이렇게하면 계층 구조에서 클래스가 "위"가 "위"라는 경우에도 비슷한 이름을 짓는 멤버를 작성하기로 결정하더라도 코드를 중단하지 않습니다. 마찬가지로, 나는 보통 우리에게 노력합니다 this
일반 회원 필드에 액세스 할 때 키워드.
업데이트되었습니다 C ++ 구문을 사용합니다.
다른 팁
두 개의 개별 정적 변수가 생성됩니다.
이 개인을 암시 적으로 선언했습니다.
class A:
{
private:
static int x;
};
class B:A
{
private:
const static int x;
};
이는 변수가 서로 경쟁하지 않음을 의미합니다.
이미 말했듯이, 그것은 두 개의 개별 변수를 만듭니다.
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
누군가 접근성이 접근성을 제한 할 수 있다고 언급했습니다. 기본 변수를 비공개로 만들면 아동 클래스에 액세스 할 수 없습니다. 그러나 변수를 보호하거나 공개 해야하는 경우 명시 적 액세스 방법을 사용하거나 방금 보여주는 로컬 범위 규칙에 의존하십시오.
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'
};