如何访问“父级”受保护的成员?

3
这是我代码的“模拟”:
#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();
}

那个 test 变量的状态类型是 protected,我无法接触它,因为它来自另一个框架并且我没有真正的“访问”。

我需要创建一个类 C 的实例,从 B 传递参数并从 C 访问 A 的参数 test

有没有更好的方法?在 B 中,我可以毫不费力地使用 test...


3
B 中添加 int getTest(){ return test;} - 463035818_is_not_a_number
2
尽管我很讨厌getter和setter,但你可以在B中定义一个公共的getter,返回对A成员的引用。 - NathanOliver
2个回答

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.  
};

在线演示

建议

尽管有一种技术上的解决方法可以实现你想要的效果,但这并不是一个明智的做法。受保护成员的概念是它只与派生类相关的实现细节。通过使用友元打开它,你会创建一个对于你不应该访问的实现细节的依赖关系。这将违反框架的设计原则。这是可能的,但风险自负。

另一种方法是在 B 中添加一个公共的 getter,并在 C 中引用这个公共成员 (演示)。这样做更好,但你仍然会暴露你不应该接触到的数据。


3
您可以在B中添加一个公共访问器:
class B : public A
{
private:
    C *c;

public:
    B();
    int get_test() const { return this->test; }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接