这是我的代码的"模拟" :
#include <string>
#include <iostream>
using namespace std;
class A
{
protected:
int test = 10;
};
class C;
class B : public A
{
private:
C *c;
public:
B();
};
class C
{
public:
C(B *b) {
cout << b->test;
}
};
B::B() {
c = new C(this);
}
int main()
{
B();
}
Run Code Online (Sandbox Code Playgroud)
我无法触及该变量的protected
状态类型test
,因为来自另一个框架,我没有真正的"访问".
我需要从B创建一个C类实例(扩展A),将B传递给它并访问(从C)到test
A 的参数.
这样做有什么好看的方式吗?在BI内可以使用测试没有任何问题......
C类不从B继承,因此B不是父类,因此C类无法访问受保护的成员.
解决方法
如果您控制B和C但不允许触摸来自其他框架的A,您可以尝试:
class B : public A
{
private:
C *c;
public:
B();
friend C; // Make C a friend of B so that it has access.
};
Run Code Online (Sandbox Code Playgroud)
劝告
尽管有一种技术解决方法可以实现您的目标,但这样做可能并不明智.受保护成员的想法是它的实现细节仅与派生类相关.通过友谊打开它,您可以创建一个依赖于您不应该访问的实现细节.所以你违反了框架的设计原则.可能但风险自负.
另一种方法可能是将公共getter添加到B中的受保护元素,然后在C中引用此公共成员(演示).它更好,但你仍然会暴露你不应该的数据.