C++ c++;类中的引用字段抛出构造函数
我有这门课:C++ c++;类中的引用字段抛出构造函数,c++,inheritance,reference,C++,Inheritance,Reference,我有这门课: typedef int ID; typedef int Salary; class Worker { protected: ID id; Salary& salary; public: Worker(); Worker(ID Id, Salary Salary) { this->id=Id; this->salary=salary; } 。 . . } 还有这个: class WSalary : public Work
typedef int ID;
typedef int Salary;
class Worker {
protected:
ID id;
Salary& salary;
public:
Worker();
Worker(ID Id, Salary Salary) {
this->id=Id;
this->salary=salary;
}
。
.
.
}
还有这个:
class WSalary : public Worker {
public:
WSalary(ID Id, Salary& Salary) {
this->id=Id;
this->salary=Salary;
}
.
.
.
}
我在构造函数中有这个错误
未初始化的引用成员“Worker::salary”[-fpermissive]
我想在WSalary
class a字段(称为salary)中输入与class worker中的“salary”字段具有相同地址的内容。。因此,当我在工人类中更改工资时,它将在WSalary
类中自动更改
解决办法是什么?
谢谢使用初始化列表:
WSalary(ID Id, Salary& Salary) : id(Id), salary(Salary)
{
}
WSalary(ID id, Salary& s) : id(id), salaray(s) {}
而不是
WSalary(ID Id, Salary& Salary) {
this->id=Id;
this->salary=Salary;
}
在worker示例中,您试图将值绑定到非常量引用。这将创建一个悬而未决的引用,这不是一个好主意。只需在类中存储一个值而不是引用,或者传递一个引用作为构造函数参数,并使用初始化列表 在
WSalary
中,您需要使用初始化列表:
WSalary(ID Id, Salary& Salary) : id(Id), salary(Salary)
{
}
WSalary(ID id, Salary& s) : id(id), salaray(s) {}
或者调用基的构造函数(如果您将其修复为接受引用):
在C++11中,还可以使用以下语法在派生类中重复使用Worker
构造函数:
using Worker::Worker;
如果间接寻址是有意的,则使用指针
一旦初始化,引用就不能引用其他内容 这意味着引用成员通常禁止类的赋值,并且不能通过赋值来初始化它
相反,指针可以通过赋值指向别处。C++要求
const
和reference
成员必须在构造函数初始化列表中初始化。你没有。作为一个参数,Salary-Salary
不会带来任何好处,更不用说作为引用成员的有效初始值设定项了。Worker
示例仍然是错误的。当我使用“WSalary(ID-ID,Salary&s):ID(ID),salaray(s){}”时,我得到了一个错误:“-class'WSalary'没有任何名为'Salary'的字段”,ID的字段也是如此。。。为什么?它应该从工人那里继承。。