【问题标题】:protected members are not accessible through a pointer or object受保护的成员不能通过指针或对象访问
【发布时间】:2016-04-14 23:01:01
【问题描述】:

我有两个类TrainingTesting,其中Training 是基类,TestingTraining 的派生类。

我有Testing类成员函数float totalProb(Training& classProb, Training& total),它有2个参数,都是Training类对象。代码:

void Testing::totalProb(Training& classProb, Training& total) {

    _prob = (_prob * ((float)(classProb._nOfClass) / total._tnClass));
    cout << "The probalility of the " << it->first << " beloning to " << classProb._classType << " is: " << _prob << endl;
}

这个函数的作用基本上是计算test1Testing 类的对象)中每个文档属于class1Training 类的对象)的概率。

所有Training 类(它是基类)变量都是Protected,所有Training 类函数都是Public

当我尝试运行 test1.totalProb(class1, total); 时,我收到错误 Error C2248 'Training::_probCalc': cannot access protected member declared in class 'Training'。我无法解决这个问题。

【问题讨论】:

  • 请制作一个更简单的代码示例 - 目前其中充满了不相关的内容,掩盖了您问题的本质。
  • @OliverCharlesworth 我让代码更简单了
  • 不要使用 c 风格的演员表。

标签: c++ class c++11 inheritance


【解决方案1】:

请考虑以下您可以创建的最小示例:

class Base
{
public:
    Base(int x = 0)
        :m_x(x) 
    {}
protected:
    int m_x;
};

class Derived : public Base
{
public:
    Derived(Derived& der)
    {
        this->m_x = 1; // works

        Base base;
        // int i = base.m_x; // will not work

        Derived works(base);
        int i = works.m_x; // also works            
    }

    Derived(Base& base)
        : Base(base) // Base(base.m_x) will not work
    {
    }

};

cpp 参考在受保护的成员访问一章中说明了以下内容 (https://en.cppreference.com/w/cpp/language/access):

类 Base 的受保护成员只能被访问

  1. Base 的成员和朋友
  2. 由从 Base 派生的任何类的成员和朋友(C++17 之前),但仅在操作从 Base 派生的类型的对象时(包括 this)

【讨论】:

    【解决方案2】:

    您正在尝试访问您的母类的另一个实例的成员: classProb,但继承使您只能访问自己父类的受保护成员。

    纠正的一种方法(但这很大程度上取决于您要做什么)是在您的培训课程中放置一个_probClass 的getter 并在您的测试中调用它,例如_probCalc 成员:

    public:
      (Type) Training::getProbCalc() {
        return _probCalc;
      }
    

    在循环中改变你的调用:

    for (it3 = classProb.getProbCalc().begin(); it3 != classProb.getProbCalc().end(); it3++)
    

    如果您尝试访问由您的母亲实例继承的您自己的成员,只需直接调用它们即可。例如:

    for (it3 = _probCalc().begin(); it3 != _probCalc().end(); it3++)
    

    【讨论】:

    • 好的,我试试getter函数告诉你。但我不明白为什么derived 类不能调用base 类的protected 变量?我读过这个,但我仍然无法理解。 但继承使您只能访问自己父类的受保护成员。 TrainingTesting 的父类
    猜你喜欢
    • 2017-10-15
    • 2018-09-08
    • 2021-01-09
    • 1970-01-01
    • 2016-12-07
    • 2014-09-12
    • 1970-01-01
    • 2021-04-25
    • 2016-02-04
    相关资源
    最近更新 更多