作为 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 类的私有成员?的主要内容,如果未能解决你的问题,请参考以下文章