这是一个"模拟"我的code:
.bar
我无法触及该#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();
}
变量的protected
状态类型,因为它来自另一个框架而且我没有真正的访问权限#34;。
我需要从B(扩展A)创建一个C类实例,将B传递给它并访问(从C)到A的参数test
。
有没有一种奇特的方式呢?在B中我可以毫无问题地使用测试...
答案 0 :(得分:5)
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.
};
<强>劝强>
尽管有一种技术解决方法可以实现您的目标,但这样做可能并不明智。受保护成员的想法是它的实现细节仅与派生类相关。通过友谊打开它,您可以创建一个依赖于您不应该访问的实现细节。所以你违反了框架的设计原则。可能但风险自负。
另一种方法可能是将公共getter添加到B中的受保护元素,然后在C中引用此公共成员(demo)。它更好,但你仍然会暴露你不应该的数据。
答案 1 :(得分:3)
您还可以在B中添加公共访问者:
class B : public A
{
private:
C *c;
public:
B();
int get_test() const { return this->test; }
};