【问题标题】:compilation error due to private variable declaration inehritance由于私有变量声明继承导致的编译错误
【发布时间】:2021-06-05 17:43:23
【问题描述】:

编译以下代码时出现以下错误:

Student.cpp:20:9: error: ‘std::string Student::name’ is private within this context
   20 |         name = _name;
      |         ^~~~
Student.cpp:7:12: note: declared private here
    7 |     string name;
#include <iostream>
using namespace std;

class Student
{
private:
    string name;
};

class UndergraduateStudent : public Student
{
};
class GraduateStudent : public Student
{
};
class Freshman : public UndergraduateStudent
{
    Freshman(string _name)
    {
        name = _name;
    }
};

这可能是什么原因?
我想将UndergraduateStudent 类保持为抽象

【问题讨论】:

  • 原因是nameStudentprivate成员变量。
  • 您知道可见性修饰符(privateprotectedpublic)吗?只是问一下,因为编译器的错误消息在这里很清楚......此外,由于没有纯虚函数,我不确定你为什么要谈论抽象类型。顺便说一句:您应该在Student 中声明一个虚拟析构函数(可以使用默认实现)。

标签: c++ inheritance


【解决方案1】:

当我在学习 C++ 中的面向对象编程时,我很难理解公共、私有和受保护,因此我想我会分享一些想法,希望能解决其中的一些问题。

首先,public、private 和 protected 用于确定类中变量或方法的可访问性级别。如果将变量声明为私有变量,则可以在声明它的类内部访问该变量,但不能在其他任何地方访问。使用 protected,您可以在声明它的类的子类中访问该变量。使用 public,您可以在任何地方访问该变量。

那么这是什么意思呢?

使用您的代码,我们从以下开始:

#include <iostream>
using namespace std;

class Student
{
private:
    string name;
};

class UndergraduateStudent : public Student
{
};
class GraduateStudent : public Student
{
};
class Freshman : public UndergraduateStudent
{
    Freshman(string _name)
    {
        name = _name;
    }
};

出现编译错误的原因是您试图访问 Freshman 类中的变量“name”。 Freshman 是 Student 的子类(嗯,它实际上是 Undergraduate Student 的子类,是 student 的子类,但这个概念仍然适用)。因此,Freshman 类中的任何方法都只能访问 Student 类中的 protectedpublic 变量和方法。因此,如果您想访问新生类中的“姓名”,则必须将其从 private 更改为 protectedpublic。。 p>

但是,在这样做之后,您可能想知道如何从类外部访问私有变量和受保护变量?在 main() 中,如果新生姓名是私有的或受保护的,您将如何获得新生姓名的值?答案是 getter 和 setter。稍微修改一下你的代码,你会得到这样的结果:

#include <iostream>
using namespace std;

class Student
{
protected:
    string name;
public:
    string getName(){
        return name;
    }

    void setName(string _name){
        name = _name;
    }
};

class UndergraduateStudent : public Student
{
};
class GraduateStudent : public Student
{
};
class Freshman : public UndergraduateStudent
{
    public:
        Freshman(){}
        Freshman(string _name)
        {
            name = _name;
        }
};

如您所见,我在 Student 中添加了几个 public 方法,getName() 和 setName()。我还在 Freshman 类中添加了一些构造函数。这些 Student 方法的重要部分是它们是公开的,并且可以在任何地方访问。代码不难理解,本质上getName()返回的是私有变量“name”的值,setName()可以改变这个值。

假设在 main() 中我想创建一个 Freshman 对象,并将她的名字声明为 Sarah,然后打印出结果。

int main(){
    Freshman freshman("Sarah");
    cout << freshman.name;
}

如果我这样做了,我会得到一个编译错误,因为我试图访问 protected 变量“name”。如果我想访问该值,我必须通过 public 方法 getName() 访问它。因此:

int main(){
    Freshman freshman("Sarah");
    cout << freshman.getName();
}

这将打印出“Sarah”的正确结果。现在,假设我拼错了她的名字,结果她的名字中没有“h”。然后,我必须调用 setName 的 public 方法才能将她的名字更改为其他名称。

int main(){
    Freshman freshman("Sarah");
    freshman.setName("Sara");
    cout << freshman.getName();
}

现在将输出“Sara”的值。这些只是有关如何使用私有、受保护和公共的一些基本示例,如果有点冗长,请见谅。如果您还不太了解如何使用它们,我希望它可以帮助您。练习一下,多练几次就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多