2012-01-04 101 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 thingy,你會有無盡的迭代,包括eachothers .h文件。但是在ifndef中,其中一個對象沒有得到包含其他類的定義,也不知道它應該創建什麼對象。 這個問題在C#中不會出現,因爲您不必包含.h文件。你甚至沒有.h文件:P。當你創建一個新班級時,其他班級都會知道這個班級的存在。但是在C++中,必須包含特定類的.h,然後才能創建該類的對象(或者甚至是引用)。

所以,我的問題是。如何使2個對象的引用成爲它們自己的成員變量?

謝謝您的關注!

乾杯,

馬克西姆蘇梅克爾

回答

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

的想法是正確的,但它通常被稱爲前向聲明,而不是一個預申報。 (在標準中,它只是一個聲明,而不是一個定義,它提供了完整的類定義。) – 2012-01-04 16:27:35

+0

謝謝兄弟,這正是我需要的^^ – 2012-01-04 16:48:02

0

你並不需要在頭文件#include。例如在Object1.h中,您可以將class Object2;代替。這有很多好處。儘量避免在頭文件中使用#include,除非在沒有它們的情況下不進行編譯。

你可以做時髦的事情像

class X; 

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

你並不需要包括Object1.hpp在Object2.hpp,如果你只用指針Objects1工作。但是您需要在Object2.cpp中包含Object1.hpp,因爲它需要實際實現Object1