gpt4 book ai didi

c++ - 为什么我不能在 friend 类中实例化一个构造函数是私有(private)的类?

转载 作者:IT老高 更新时间:2023-10-28 22:02:47 26 4
gpt4 key购买 nike

我有两个类; Salary 用于保存有关员工薪水的信息和计算,Employee 具有 class Salary 类型的对象和一些成员,例如员工的姓名和地址...

  • 我想要做的是防止 class Salary 被实例化,除了 class Employee。所以我将 Salary 的构造函数声明为私有(private),并使 Employee 成为 Salary 的 friend 。但我得到错误:

    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 的 friend ,就像在 Salary 中一样:

    class Salary {
    //...
    friend int main(int argc, char* argv[]);
    };

现在程序可以正确编译了!

*** 如果我这样声明一个对象,main 中的另一件事:

Employee emp; // ok
Employee emp{}; // error?

最佳答案

因为您没有为 Employee 提供构造函数,所以初始化 Employee emp{}; 中的大括号将执行 aggregate initialization ,这实质上意味着每个成员在 main() 的上下文中使用默认规则一一初始化。由于 main() 无法访问 Salary 构造函数,因此它失败了。

正如其他人所指出的,添加一个 Employee 默认构造函数将解决您的问题:

class Employee {
public:
Employee() = default;
std::string name_;
Salary sal;
};

关于c++ - 为什么我不能在 friend 类中实例化一个构造函数是私有(private)的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com