c++ - 为什么我不能在朋友类中实例化一个构造函数是私有的类?
问题描述
我有两节课;Salary
它旨在保存有关员工薪水的信息和计算,并且Employee
具有类型对象class Salary
和一些成员,例如员工的姓名和地址...
我想要做的是防止
class Salary
被实例化,除了class Employee
. 所以我声明了Salary
private 的构造函数并结交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*[]);
并在薪水中结交
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;
};
推荐阅读
- aspnetboilerplate - 启动项目中的 Web.Tests 项目发生了什么?
- objective-c - Objective-C 崩溃:从类创建对象
- python - PyMongo如何获取集合中的最后一项?
- javascript - 获取特定单元中某个css属性的值
- sendmail - 由于“握手错误”,无法使用 STARTTLS 连接到 Outlook SMTP
- ruby-on-rails - 如何在 rake 任务中使用 ActiveStorage 将图像附加到对象?
- c# - HTTPwebresponse 不起作用,我无法发布任何内容
- reactjs - 在 ReactJS 中使用 jest 将作为 props 传递的操作存根以进行单元测试
- mysql - 任意选择的非聚合列是否保证来自具有 MySQL GROUP BY 的同一行?
- scala - 隐式转换和 null