2011-02-22 3 views
1

Xcode에서 내 클래스 중 하나의 전달 선언을 사용하는 데 문제가 있습니다.Xcode에서 클래스의 전달 선언을 사용할 때 오류 발생

가 여기 내 기본 구조입니다 :

MyClassA.h :

class MyClassA{ 
    ... list of members and method prototypes ... 
}; 

MyClassA.cpp :

#include "MyClassA.h" 

--- list of methods for MyClassA ... 

MyClassB.h :

class MyClassA; // forward declaration 

class MyClassB{ 
    ... list of members and methods ... 
    MyClassA* ptrToA; 
}; 

MyClassB.cpp :

#include "MyClassB.h" 

... list of methods for MyClassB ... 

Visual Studio의 내 Windows 컴퓨터에서 문제없이 작동합니다. 그러나 Xcode의 Mac에서는 오류가 발생합니다.

Forward declaration of 'struct MyClassA' 

아이디어가 있으십니까? 오류 메시지는 내가 평범한 클래스를 선언 한 이후로 구조체에 대한 오류가 다시 발생하기 때문에별로 의미가없는 것처럼 보입니다. Xcode에서 전달 선언이 지원되지 않습니다 (아주 단순한 오류 메시지가 struct/class 혼란 이외의 문제임을 나타냄)? 내 프로젝트는 C가 아닌 C++로 컴파일됩니다.이 프로젝트를 놓친 다른 프로젝트 설정이 있습니까?

감사합니다.

+1

전체 견적을 인용 할 수있는 예제로 정리해보십시오. 그러면 사람들은 예를 들어 MyClassA 선언이 끝날 때 실제로 세미콜론을 사용하지 않았는지 궁금 할 필요가 없습니다. – JWWalker

답변

1

ptrToA을 참조하지 않으려는 경우 또는 내재 된 유형에 대해 알아야 할 필요가없는 경우를 제외하고는 #include "MyClassA.h" 이 MyClassB.cpp에 있는지 확인하십시오.

+0

내 잘못입니다. 어쨌든 고마워. 나는 단순히 선언이 어떻게 작동하는지 오해했다. 나는 앞으로 선언문을 MyClassB.h의 MyClassA.h에 포함시키는 대신에, 모든 것이 연결되어 있으면 필요한 것을 얻을 수 있기를 바랬다. (Objective-C는 내가 발견 한 것과 같은 방식으로 작동한다.) MyClassA.h를 포함하면 앞으로 선언을 작성해야 할 이유가 없습니다 ... 전체 선언이 이미 포함되어 있으며 포함에서 사용할 수 있습니다. – DiggyJohn

+0

@ TheJohn 당신은 우리에게 모든 관련 코드를 보여주지 않았습니다. 그것은 당신이 기술하고있는 꽤 일반적인 기술이며, 컴파일 시간을 향상 시키는데 매우 유용합니다. – wilhelmtell

+0

실제 클래스 이름과 다른 관련없는 멤버 및 메서드 (float, chars 및 constructors 묶음)를 대체했지만 위의 예제 코드에서 설명한 모든 것은 ** 관련 ** 코드의 100 %입니다. – DiggyJohn

0

실제로 오류의 원인이되는 코드 줄은 무엇입니까? 내 기대는 MyClassB.cpp에 MyClassA.h를 포함하는 것을 잊어 버렸고 객체를 new 시도하면 오류가 실제로 발생합니다.

클래스는 구조체입니다. 그들은 구조체가 public으로 표시하는 동안 멤버를 private로 표시합니다.

+0

실제 전달 선언 자체에 오류가 있습니다. 아직 객체를 "새로 작성"하는 코드는 작성하지 않았습니다. – DiggyJohn

+0

앞으로 선언이 어떻게 작동하는지 오해 한 것 같습니다. 전에 많이 사용했지만 회상에서는 기억하지 않습니다 (이전 코드를 다시 살펴 보았습니다).ClassA와 ClassB가 같은 헤더에 함께 존재하고 서로를 참조했기 때문에 내가 사용한 모든 곳에서 앞으로의 선언이 필요했습니다. 그래서 내가 뭘하려고하는지 ClassB.h에 ClassA.h를 포함시켜야 할 필요가 있습니다 ... 그러나 이렇게하면 순방향 선언을 완전히 무의미하게 만듭니다. 왜냐하면 클래스의 전체 선언은 이미 존재합니다. – DiggyJohn

+0

아니, 나는 당신이 전혀 오해하지 않았다고 생각하지 않습니다. ClassA에 대한 포인터가 필요한 경우 앞으로 선언하면됩니다. 그러나 객체를 할당하거나 멤버 함수를 호출하는 등 사용을 시작하자마자 전체 선언이 필요합니다. 그것이 ClassB.cpp에서 수행하는 작업이라면 ClassA.h를 포함시켜야합니다. –

관련 문제