我有一个基类/父类:人
两个子类/子类:Player,Coach
这是基类Person的标题:
class Person
{
public:
Person(string name);
Person();
virtual ~Person();
string getName();
void setName(string name);
virtual void printSpec() const = 0;
private:
string name;
};
我试图编译并运行,它开始抱怨这个:
include\Person.h||In constructor 'Coach::Coach(std::string, std::string)':|
include\Person.h|19|error: 'std::string Person::name' is private|
\src\Coach.cpp|5|error: within this context|
||=== Build finished: 2 errors, 0 warnings ===|
并指出:
private:
string name;
在子类“Coach”的两个构造函数中的一个的上下文中:
Coach::Coach(string name, string responsibility): Person(name){
this->name = name;
this->responsibility = responsibility;
}
然而,它并没有对“Player”类的构造函数中的同一行提出相同的抱怨,只是在“Coach”类的构造函数中抱怨“字符串名称是私有成员”
我为其他人查找了一些解决方案,试过保护而不是私有,尝试更改变量的名称,但没有用。
是什么给出了?
答案 0 :(得分:5)
派生类无法访问private
成员。
解决方案可能是使用 member-initialization-list 来做到这一点:
Coach::Coach(string name, string responsibility): Person(name){
// ^^^^^^^^^^^^
// Initialize the name through the base class constructor
this->responsibility = responsibility;
}
因为Person
是基类并且有一个带名字的构造函数,所以你可以这样做。您无需从派生类访问name
成员。
另一种解决方案可能是设置此成员protected
(第一个解决方案仍然更好)。
class Person
{
public:
Person(string name);
Person();
virtual ~Person();
string getName();
void setName(string name);
virtual void printSpec() const = 0;
protected:
// ^^^^^^^^^
string name;
};
你可以看一下here,继承部分谈谈访问类型。
不回答这个问题但是对于一些好的做法,我建议您将string
参数作为const
参考传递给我。这是better practice:
Coach::Coach(const string& name, const string& responsibility): Person(name){
// ^^^^^ ^ ^^^^^ ^
this->responsibility = responsibility;
}
答案 1 :(得分:2)
name
在基类中是私有的,因此您无法从派生类访问它。
假设Coach从Person公开派生,你可以使成员变量受到保护,但幸运的是Person
构造函数采用了一个名称,所以你不需要直接从派生类中访问它。您可以使用初始化列表,因此无需设置两次
Coach::Coach(string name, string responsibility)
: Person(name){
// ^^^^^^^^^^^^
// Sends name to Person's constructor
this->responsibility = responsibility;
}
答案 2 :(得分:1)
将“private”更改为“protected”private表示系统的其他任何部分(包括派生类)都不能访问该成员。