我的情况类似于Specify a class member function as a friend of another class?中描述的情况。
但是在我的情况下,B类需要知道A类,因为它正在使用它,因此该线程中给出的解决方案对我不起作用。我试图给函数本身提供一个前向声明,但它也不起作用。似乎每个班级都需要另一个班级的完整定义......
有没有简单的方法可以解决它?我更喜欢一种解决方案,它不涉及包装其中一个旧类的新类。
代码示例:
//A.h
class B; //not helping
void B::fB(); //not helping
class A
{
public:
friend void B::fB();
void fA(){};
protected:
void fA_protected(){};
};
//B.h
#include "A.h"
class B
{
private:
A a;
public:
void fB(){ a.fA_protected();} // this function should call the protected function
void fB2(){ a.fA(); }
};
感谢帮助者!
(顺便说一句,这是我的第一个问题,我希望我能清楚地解释一下)
答案 0 :(得分:1)
如果您可以更改B以在A上使用指针,则以下内容可能有所帮助: (我使用原始指针,因为根据注释你不能使用智能指针。)
//A.h
#include "B.h"
class A
{
public:
friend void B::fB();
void fA() {};
protected:
void fA_protected(){};
};
//B.h
class A; // forward declaration
class B
{
private:
A* a;
public:
B();
~B(); // rule of 3
B(const B& b); // rule of 3
B& operator = (const B&); // rule of 3
void fB(); // this function should call the protected function
void fB2();
};
//B.cpp
#include "B.h"
#include "A.h"
B::B() : a(new A) {}
B::~B() { delete a; } // rule of 3
B::B(const B& b) : a(new A(*b.a)) {} // rule of 3
B& B::operator = (const B&) { *a = *b.a; return *this; } // rule of 3
void B::fB() { a->fA_protected();}
void B::fB2() { a->fA(); }