2012-01-04 5 views
2

저는 C++을 처음 접했고 기본 아키텍처를 설정하는 데 문제가있었습니다. C#에서이 특정 아키텍처를 사용하는 방법을 배웠지 만 C++에서는 작동하지 않습니다. 내 문제는 다음과 같습니다. 개체가 2 개 있습니다. 나는이 객체들이 서로를 '알기'를 원한다. 그래서 나는이 두 객체의 참조를 그들 자신의 구성원 변수로 원한다.개체의 멤버 변수로 사용되는 C++ 개체 참조

이를 고려

//main.cpp: 
#include "Object1.h" 
#include "Object2.h" 

Object1 *obj1; 
Object2 *obj2; 

... 

obj1 = new Object1(obj2); 
obj2 = new Object2(obj1); 

... 


//Object1.h 

#ifndef OBJECT1_H 
#define OBJECT1_H 

#include "Object2.h" 

class Object1 { 
    public: 
    Object1(Object2*); 

    Object2 *obj; 
} 

#endif 


//Object2.h 

#ifndef OBJECT2_H 
#define OBJECT2_H 

#include "Object1.h" 

class Object2 { 
    public: 
    Object2(Object1*); 

    Object1 *obj; 
} 

#endif 

이 그러나 불가능하다. 왜냐하면 ifndef를 사용하지 않으면 eachothers .h 파일을 포함하는이 끝없는 반복을 할 수 있기 때문입니다. 그러나 ifndef를 사용하면 객체 중 하나가 다른 클래스 정의를 포함하지 않고 어떤 객체를 만들지 알 수 없습니다. .h 파일을 포함 할 필요가 없기 때문에 C#에서는이 모든 문제가 발생하지 않습니다. 당신은 .h 파일조차 가지고 있지 않습니다 : P. 여러분이 새로운 클래스를 만들면이 클래스가 존재할 때마다 다른 클래스가 모두 존재한다는 것을 알 수 있습니다. 그러나 C++에서는이 클래스의 객체 (또는 참조 객체)를 만들기 전에 특정 클래스의 .h를 포함해야합니다.

내 질문은. 서로의 참조가있는 객체 2 개를 멤버 변수로 어떻게 만들 수 있습니까?

관심을 가져 주셔서 감사합니다.

건배, 그냥

맥심 Schoemaker

답변

5

당신은 미리 선언을 사용는 :

class Object1;  // Pre-declare this class, so we can have pointers to it 

Object1 *object1; // Works fine, without having the full declaration of Object1. 
+2

생각은 오른쪽에 있지만 일반적으로 앞으로 선언하지 미리 선언으로 알려져있다. (그리고 표준에서는 단순히 선언입니다. 전체 클래스 정의를 제공하는 정의와 반대입니다.) –

+0

고마워요, 그게 꼭 필요한 것 ^^ –

0

당신은 헤더 파일에 #include 필요하지 않습니다. 예를 들어 Object1.h의 경우 class Object2;을 대신 입력하면됩니다. 이것은 많은 장점을 가지고 있습니다. 헤더 파일에 컴파일하지 않는 한 #include을 사용하지 마십시오.

당신처럼 펑키 일을 할 수

class X; 

X returnX(); 
void processX(X x); 
    -
0

당신은 단지 Objects1에 대한 포인터로 작업하는 경우 Object2.hpp에 Object1.hpp을 포함 할 필요가 없습니다. 그러나 Object1.hpp에 Object1.hpp를 포함시켜야합니다. Object1의 실제 구현이 필요하기 때문에

관련 문제