我有以下代码:
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私人会员?
答案 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
类,而是使用指向它的指针。