2011-07-18 5 views
3

가능한 중복 : 차이점. 및 :: C++ 정적 멤버에 대한?

나는 내가 Class::Variable을 수행 할 때 Error left of 'Variable' must have class/struct/union 내가 오류를 얻을 수 없다는 오류가 Class.Variable를 사용하여 내 정적 변수에 액세스하려고
When do I use a dot, arrow, or double colon to refer to members of a class in C++?

. 두 경우 모두 인텔리 센스를 통해 Variable이됩니다. 이 경우 정확히 .::의 차이점은 무엇입니까?

+2

흠. Intelisense는 컴파일러가 아닙니다. –

+0

오류가 발생하는 실제 코드를 게시해야합니다. –

답변

6

정적 멤버는 두 가지 방법으로

를 통해 액세스 할 수

의 (a) 클래스의 인스턴스로 : 인텔리 당신을 위해뿐만 아니라 작동하는 이유가 될 수있는 일을한다고합니다 obj.variable

(b) 클래스의 인스턴스가없는 경우 - ::을 사용하십시오. class::variable

0

.은 인스턴스 참조입니다 (예 : LHS에는 개체가 있음). ::은 정적 참조입니다. RHS에는 유형이 있습니다.

0

도트 연산자 ("클래스 멤버 액세스 연산자"라고도 함)에는 클래스/구조체의 인스턴스가 필요합니다.

struct X 
{ 
    static int x = 5; 
    int y = 3; 
} 
namespace NS 
{ 
    int z = 1; 
} 

void foo() 
{ 
    X instance; 
    instance.x; // OK, class member access operator 
    X::x;  // OK, qualified id-expression 
    instance.y; // OK 
    X::y;  // Not OK, y is not static, needs an instance. 
    NS.z;  // Not OK: NS is not an object 
    NS::z;  // OK, qualified-id expression for a namespace member. 
} 

표현은 C++ 0x FDIS에서 취해진 것입니다.

+0

그래서 여기 누가 맞습니까? 데이비드 (a.b는 정적 b는 괜찮습니다) 또는 나이트 크래커 (a.b는 정적이라면 a.b가 모두 잘못되었다고 말합니다) ??? – stijn

+0

David : 그렇게 생각합니다. FDIS C++ 0x '9.4/2'는 실제로 그것이 합법이라고 진술합니다. 편집 할 것입니다. – rubenvb

+0

'X.x'와'X.y' 둘 다 당신의 예제에서는 OK가 아닙니다. – interjay

2

.은 클래스 이름으로 객체 ::에 사용됩니다.

struct foo { 
    int x; 
    static int y; 
}; 

foo bar; 

bar.x = 10; // ok 
bar.y = 20; // ok - but bad practice 

foo.x = 10; // WRONG foo is class name 
foo.y = 20; // WRONG foo is class name 

foo::x = 10; // WRONG x requires object 
foo::y = 20; // ok 

가장 좋은 방법 :

bar.x = 10; 
foo::y = 20; 
+1

'bar.y = 20; // ok -하지만 나쁜 습관'__NO__, 그것은 단순한 __wrong__이며 표준에서 허용되지 않습니다. 안타깝게도 VC++은 합법적 인 _extensions_를 제공하지만, 꼭 그렇지는 않습니다. – orlp

+3

@nightcracker : "잘못"하지 않았습니다. '.' 또는'->'를 사용하여 정적 또는 기타 멤버에 액세스 할 수 있습니다. @Artyom : 왜 "나쁜 습관"이라고 말합니까? –

0

:: 클래스/네임 스페이스 범위에 대한,하지만 .의 왼쪽이 경우의 변수이어야합니다. 사용 . 예를 들어, -

Class x; 
doSomething(x.Variable); 
클래스의
0
Class::StaticProperty 
InstanceOfClass.Property 
관련 문제