C++ 对象引用作为对象的成员变量
C++ Object references as member variables of objects
我对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 的实际实现
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查