2013-05-13 3 views
-2

C++에서 이것이 오류 인 이유를 알고 있습니다.클래스에서 선언 한 정적 변수

class A 
{ 
    A b; 
}; 
int main() {} 

type of b is unresolved at the compile time입니다. 그럼 왜 아래 코드가 맞습니까?

class A 
{ 
    static A b; 
} 
int main() {} 

정적 인 경우 변수 b의 유형이 해석됩니까 ?? 다음 코드는 자바를 위해 일하는 놀랍게도

그리고 마지막으로는 :

public class Main 
{ 
Main g; 
public static void main(String[] args) 
{ 
    System.out.println("hi"); 
} 
} 

왜 그렇게입니까? 정적 변수는 인스턴스가 아닌 클래스에만 해당된다는 것을 알고 있습니다. 그러나 그것은 위의 질문에 대한 대답을주지 못합니다. 제게 약간의 빛을 던져주세요.

+4

** 여기서 좋은 질문을하기 전에 * C++ 프로그래밍 책을 읽으십시오 .... 우리는 몇 분 안에 C++을 배울 수 없으며 배우려면 많은 시간이 필요하며 실험을해야합니다. 컴파일러에서 모든 경고를 활성화하십시오. –

+0

Java의 변수는이 경우 C의 포인터와 비슷합니다. – Elazar

+1

FYI :'static'은 타입 분해와는 전혀 관련이 없습니다. –

답변

5

때문에 :

static A b; 

(클래스 자체에) 정의되지 않으므로 클래스의 전체 정의가 필요하지 않습니다.

Java는 규칙이 다르며 불완전한 개념이 없습니다. 물론 Java의 변수는 사용자 정의 객체 유형이 아니라 객체 유형에 대한 참조 (C++ 포인터와 유사)입니다. Java에서 변수 선언에 대한 C++의 동등 함은 Main* g;입니다.

+1

귀하의 답변과 [this] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration)는 제가이 의심을 해결하는 데 도움이되었습니다. (나는 정적 변수가 먼저 선언되고 정의되었다는 사실을 잊었다) Thnaks alot. :) – nitish712

3

컴파일 타임에 b 유형이 확인되지 않기 때문에. b의 유형은 그 시점에서 불완전 때문에

아니, 그건. 변수에 불완전 유형을 선언 할 수 있지만 을 정의하지 않으면을 정의합니다. 정의는 객체를 저장하기위한 공간을 할당하기 때문에 객체의 크기를 알아야합니다.

정적 멤버 선언은 단지 선언입니다. 변수가 사용되는 경우 다른 곳에 정의되어야합니다. 그래서 클래스 내에서 선언하는 것이 좋습니다.

비 정적 구성원 선언은 정의입니다. 그것은 클래스 내에서 변수를위한 공간을 할당하고 그 타입은 완전해야합니다. (또한 비어 있지 않은 객체가 같은 유형의 객체를 포함하는 것은 논리적으로 불가능합니다.)

Java에는 불완전한 유형에 대한 개념이 없으며 모든 클래스가 다른 클래스를 포함 할 수 있습니다 (참조).

관련 문제