我有两节课;Salary
旨在保存有关雇员薪水的信息和计算,并且Employee
具有类型对象class Salary
和一些成员,例如雇员的姓名和地址...
我想做的是防止class Salary
被实例化,除非由class Employee
。所以我宣布了Salary
私有的构造器,并成为Employee
了朋友Salary
。但是我得到了错误:
class Employee;
class Salary {
public:
private:
Salary() : revenue_{}, cost_{} {}
Salary(int x, int y) : revenue_{ x },
cost_{ y } {
}
int revenue_, cost_;
friend class Employee;
};
class Employee {
public:
std::string name_;
Salary sal;
};
int main(){
Employee emp{}; // "Salary::Salary()" is inaccessible
}
如果我向前声明,问题就解决了main
:
int main(int, char*[]);
并在Salary中结交main
一个class Salary
这样的朋友:
class Salary {
//...
friend int main(int argc, char* argv[]);
};
现在程序可以正确编译了!
***如果以这种方式声明对象,则主要是另一件事:
Employee emp; // ok
Employee emp{}; // error?
因为您没有为Employee
括号提供构造函数,所以初始化Employee emp{};
将执行聚合初始化,这实际上意味着在的上下文中,每个成员都使用默认规则进行了一对一的初始化main()
。由于main()
无法访问Salary
构造函数,因此失败。
正如其他人指出的那样,添加Employee
默认构造函数将解决您的问题:
class Employee {
public:
Employee() = default;
std::string name_;
Salary sal;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句