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

时间:2011-12-13 17:22:20

标签: c++

我有以下代码:

Master.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);
}

Friend.h

#ifndef FRIEND_H
#define FRIEND_H

#include "Master.h"

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

      void Test(Master* masterPtr);
};

#endif // FRIEND_H

Friend.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;
}

我希望班级朋友能够分享师父的私人会员。但是,我无法编译这段代码。我尝试过Forward Declaration和#includes,但我开始涉及循环依赖。当Friend类不是Master类的成员时,代码会编译?

朋友班可以成为师父并成为朋友吗? 朋友们怎么可以访问Masters私人会员?

2 个答案:

答案 0 :(得分:3)

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

在Master.h中:

#include "Friend.h"

在Friend.h中:

class Master;

在Friend.cpp中:

#include "Master.h"

Friend.h中放置前向声明可以防止循环依赖。前向声明已足够,因为您只声明Master*参数,而不使用其成员。

您需要在Friend.h中加入Master.h,因为您要声明Friend成员,这需要完整的类型。

答案 1 :(得分:1)

看起来你正在努力解决循环依赖问题。请注意,要创建friend内容,您不需要包含它。也就是说,在你的Master类中,你实例化了需要将其包含为头的朋友(否则编译器将全部是WTF?)。

但是,在friend.h中,您只需向前声明主类,而不是直接包含它:

class Master;

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