2014-02-19 2 views
6

두 가지 방법의 차이점은 무엇입니까?"class"키워드로 변수 선언하기 vs 함수 서명에서 "class"키워드없이 선언하기

때로는 컴파일러가 함수 서명의 일부 클래스 유형을 인식하지 못한다고 불평하는 컴파일 타임 오류가 발생하면 각 변수 앞에 "class"키워드를 추가하면 항상이 종류의 컴파일 타임 오류. 예를 들어

, 내가

void recv(class Client * c) 

로 변경하는 경우 컴파일러는 다음

void recv(Client * c) 

의 유형을 클라이언트를 인식하지 못하는 경우 문제는 해결된다.

나는이 질문을 무작위로 생각해 냈기 때문에 구체적인 예를 생각해 내지 못해서 죄송합니다.

+0

들어 본 적이 없습니다. 이 오류를 표시하는 [SSCCE] (http://sscce.org/)를 줄 수 있습니까? – delnan

답변

12

키워드 클래스를 사용하여 형식 매개 변수 선언의 struct, enum을 정교한 형식 지정자라고합니다. 이 함수는 함수가 선언 된 범위에 새 유형을 도입합니다. 전달 선언과 비슷합니다.

또 다른 선언문을 사용하고 있습니다. 예를 들어, 객체 또는 함수 이름의 이름이 같은 이름의 클래스 또는 열거 형을 숨길 경우 이 경우 예를

struct A {}; 

A A; // now A is seen as an identifier of the object 

void f(struct A); 
+0

그래서이 상황에서 우리는 함수 f의 서명에 키워드 struct가 필요하며 두 번째 줄에 선언 된 변수 이름 A와 A를 구별합니다. –

+0

@phresnel 네, 맞습니다. –

1

를 들어

void recv(Client * c) 

컴파일러는 Client의 선언을 찾습니다. 찾을 수 없으면 오류가 발생합니다. 다음과 같이 앞으로 선언하여 해결할 수 있습니다.

class Client; 
void recv(Client * c) 

두 번째 사례는 본 적이 없지만 클래스 클라이언트도 여기에 선언 된 것처럼 보입니다.

1

매개 변수 앞에 class을 붙이면 컴파일러가 Client 클래스를 인식하지 못했다는 의미입니다. 다음과 같은 인위적인 예를 보자는 변수 m을 만들려고하고 프로그램 컴파일을 거부 할 때 MyClass이 주요 기능 후에 선언

int main(int argc, char *argv[]) 
{ 
    MyClass m; 

    return 0; 
} 

class MyClass 
{ 
}; 

때문에, 주요 기능은 MyClass라는 클래스를 인식하지 못합니다. 함수 매개 변수의 유형 전에 class 키워드의 사용은 기본적으로 앞으로 당신을위한 클래스 이름 선언되어 귀하의 경우에는

class MyClass; // <-- Forward declare MyClass. 

int main(int argc, char *argv[]) 
{ 
    MyClass m; 

    return 0; 
} 

class MyClass 
{ 
}; 

:

는이 문제를 해결하려면 일반적으로 앞으로 선언을 사용합니다.

+0

그래서 나는 위에서 언급 한 것처럼 함수 시그니처에서 정교한 형식 지정자를 사용하지 않고도 파일의 맨 처음에 클래스 선언 Client를 선언 할 수있었습니다. –

+0

@takwing - 예, 그렇습니다. –

1

컴파일러는 함수 매개 변수의 형식을 알아야합니다. Client 헤더를 포함 시켜서 예를 들어 명확하게 정의를 제공하지 않으므로 전달 선언을 제공해야합니다.이것은 두 번째 예제에서 (비정상적인 방식으로) 수행하므로 컴파일러는 Client가 클래스라는 것을 알고 있습니다. 포인터 만 사용하기 때문에 선언이 충분하므로이 시점에서 정의가 필요하지 않습니다.