c ++从成员对象访问实例化类的其他成员

时间:2020-10-28 17:40:14

标签: c++ oop

我对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);
  // ...
}

如何在没有包含循环等的情况下执行此操作?

2 个答案:

答案 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文件中。