2

我对 C++ 有点陌生,在设置主架构时遇到了问题。我学会了如何在 C# 中使用这个特定的架构,但我无法让它在 C++ 中工作。我的问题如下:我有 2 个对象。我希望这些对象相互“了解”,因此我希望将这两个对象的引用作为其内部的成员变量。

考虑一下:

//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 对象之一不会包含其他类定义,并且不知道它应该创建什么对象。这整个问题不会出现在 C# 中,因为您不必包含 .h 文件。你甚至没有 .h 文件:P。当你创建一个新班级时,其他班级都知道这个班级的存在。但是在 C++ 中,您必须包含特定类的 .h 才能创建此类的对象(甚至是引用)。

所以,我的问题是。如何使两个相互引用的对象作为它们自己的成员变量?

感谢您的关注!

干杯,

马克西姆·舒梅克

4

4 回答 4

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.
于 2012-01-04T16:24:00.823 回答
1

为了处理您描述的情况,在 c++ 中,有一种叫做 -前向声明的东西。

一些有用的链接:

http://en.wikipedia.org/wiki/Forward_declaration

http://www-subatech.in2p3.fr/~photons/subatech/soft/carnac/CPP-INC-1.shtml

于 2012-01-04T16:40:24.800 回答
0

您不需要#include头文件中的 。例如,Object1.h你可以只放class Object2;。这有很多优点。尽量避免#include出现在头文件中,除非没有它们就无法编译。

你可以做一些时髦的事情,比如

class X;

X returnX();
void processX(X x);
    -
于 2012-01-04T16:28:00.190 回答
0

如果您只使用指向 Objects1 的指针,则不需要在 Object2.hpp 中包含 Object1.hpp。但是您需要在 Object2.cpp 中包含 Object1.hpp,因为它需要具有 Object1 的实际实现

于 2012-01-04T16:28:36.070 回答