C++ 对象引用作为对象的成员变量

C++ Object references as member variables of objects

本文关键字:成员 变量 对象 对象引用 C++      更新时间:2023-10-16

我对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 的东西,您将拥有包含彼此 .h 文件的无休止的迭代。但是使用 ifndef 时,其中一个对象没有包含其他类定义,并且不知道它应该创建什么对象。这整个问题不会出现在 C# 中,因为您不必包含 .h 文件。您甚至没有 .h 文件:P。当你创建一个新类时,每个其他类都知道这个类的存在。但是在C++你必须包含特定类的.h,然后才能创建这个类的对象(甚至一个引用(。

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

感谢您的关注!

干杯

马克西姆·舍梅克

您使用预声明,它只是:

class Object1;     // Pre-declare this class, so we can have pointers to it
Object1 *object1;  // Works fine, without having the full declaration of Object1.

为了处理你描述的情况,在 c++ 中,有一个叫做 -Forward 声明的东西。

一些有用的链接:

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

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

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

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

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

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