我对C ++相当陌生,现在正尝试解决以下问题: 在单独的文件中有两个用户定义的类。我想从其成员之一(MyObject)访问实例化类(Master)的成员。因此,在此示例中,我想从my_object实例中访问other_member_变量:
主类定义:
//master.h
#include "myobject.h"
class Master
{
// ...
public:
MyObject* my_object_ = new MyObject(this);
int other_member_;
// ...
}
和“成员类”的定义:
//myobject.h
#include "master.h"
class MyObject
{
// ...
public:
MyObject(Master* parent);
// ...
}
如何在没有包含循环等的情况下执行此操作?
答案 0 :(得分:2)
使用前向声明标头:
master.fwd.h
class Master;
master.h
然后#include "master.fwd.h"
,以确保它们保持同步。
myobject.h
也应该#include "master.fwd.h"
,这意味着它将知道存在一个名为Master
的类,并且您可以定义构造函数以采用该类型的参数。
然后,您可以让myobject.cpp
#include "master.h"
来获取Master
的完整定义,以便构造函数可以通过指针访问Master
对象。
如果您正在使用较大的代码库,并且class Master;
和myobject.h
是独立维护的,那么将Master
直接放入MyObject
是不好的做法,因此我建议您习惯于使用前向声明头。 this answer中详细说明了这样做的原因。
答案 1 :(得分:1)
//master.h
#pragma once;
class MyObject; // declaration (incomplete type, but ok)
class Master
{
// ...
public:
Master();
MyObject* my_object_;
int other_member_;
// ...
};
// Master.cpp
#include "master.h"
#include "MyObject.h"
Master::Master() : my_Object_(new MyObject(this)) { }
您可能想要私有数据,需要担心复制指针,删除指针以及所有常见问题。但是,通过在标头中使用前向声明来打破循环,并将使用移至cpp文件中。