作为 B 类成员的 A 类如何共享 B 类的私有成员?

Posted

技术标签:

【中文标题】作为 B 类成员的 A 类如何共享 B 类的私有成员?【英文标题】:How can a class A, that is a member of class B, share private members of class B? 【发布时间】:2011-12-13 17:22:19 【问题描述】:

我有以下代码:

大师.h

#ifndef MASTER_H
#define MASTER_H

class Master

   friend class Friend;

   public:
      Master(void);
      ~Master(void);
      void CallFriendFunction(int largeData);

   private:
      int    largeData;

      //Want this class to share largeData;
      Friend testFriend;
;
#endif // MASTER_H

Master.cpp

#include "Master.h"

Master::Master(void)

   //Inentionally left blank


Master::~Master(void)

   //Intentionally left blank


void Master::CallFriendFunction(int largeData)

   this->largeData = largeData;
   this->testFriend.Test(this);

朋友.h

#ifndef FRIEND_H
#define FRIEND_H

#include "Master.h"

class Friend

   public:
      Friend(void);
      ~Friend(void);

      void Test(Master* masterPtr);
;

#endif // FRIEND_H

朋友.cpp

#include "Friend.h"
#include <iostream>

Friend::Friend(void)

   //Intentionally left blank


Friend::~Friend(void)

   //Intentionally left blank


void Friend::Test(Master* masterPtr)

   std::cout << masterPtr->largeData << std::endl;

我希望班级朋友能够分享大师的私人成员。但是,我无法编译此代码。我已经尝试过前向声明和#includes,但我开始陷入循环依赖。当Friend类不是Master类的成员时,代码是否编译?

Friend类是否可以成为Master的成员并成为朋友? Friend 类还能如何访问 Masters 私人成员?

【问题讨论】:

什么是编译器错误。 (C&P 他们) 如果我使用上面的代码:在 Master.h 文件中:错误:“朋友”没有命名类型。如果我在 Master.h 中#include "Friend.h",我会在 Friend.h 中得到一个错误:错误:'Master' has not been declared。然而#include "Master.h" 就在那里。 【参考方案1】:

您需要以下包含和转发声明:

在 Master.h 中:

#include "Friend.h"

在 Friend.h 中:

class Master;

在 Friend.cpp 中:

#include "Master.h"

将前向声明放在Friend.h 中可以防止循环依赖。前向声明就足够了,因为您只声明了一个 Master* 参数,还没有使用它的成员。

您确实需要包含 Master.h 中的 Friend.h,因为您要声明一个 Friend 成员,这需要一个完整的类型。

【讨论】:

谢谢,这成功了。我正在与循环依赖作斗争,我确实尝试在 Friend.h 中使用前向声明。诀窍是 Friend.cpp 中的#include。【参考方案2】:

您似乎在与循环依赖作斗争。请注意,要创建 friend 您不需要包含它。也就是说,在您的 Master 类中,您实例化了需要将其包含为标头的朋友(否则编译器将全是 WTF?)。

但是,在friend.h 中,您可以简单地前向声明主类而不直接包含它:

class Master;

这是因为您没有尝试实例化 Master 类,而是使用指向它的指针。

【讨论】:

以上是关于作为 B 类成员的 A 类如何共享 B 类的私有成员?的主要内容,如果未能解决你的问题,请参考以下文章

对象作为成员变量

友元的友元类

什么是友元?

C++友元详解

java基础04 匿名内部类

内部类的使用类型