为什么不能在一个朋友类中实例化其构造函数是私有的类?

Syfu_H

我有两节课;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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不能在Java中实例化一个抽象类?

我为什么不能访问在一个构造函数创建类的实例(JAVA)

为什么默认构造函数和参数化构造函数都在一个类中?

为什么我不能在类定义中实例化同一类的对象

当自己创建一个类的实例时,为什么不执行构造函数中的语句?

C ++-如何在另一个类中使用私有构造函数实例化对象

为什么我不能在 operator<< 中访问 Box 类的私有函数?

在Java中,如何使用私有构造函数创建一个类,而该私有构造函数的超类也具有私有构造函数?

为什么我不能在类/静态方法中使用私有的、内部的、文件私有的方法?

为什么一个类的实例可以访问其自身类型的另一个实例的私有字段?

在同一个类中使用构造函数参数时,为什么可以访问私有属性

为什么我不能在 Javascript 中的同一个类函数中调用一个类函数?

用私有构造函数测试一个类

将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递的实例拥有的列表中

为什么不能在模板化类中内联定义未模板化的朋友?

如何使PHP类在其构造函数中实例化另一个类?

在C ++中,为什么不能使用另一个类的模板类型来与模板类成员函数成为朋友?

为什么PRIVATE成员函数不能成为另一个类的朋友函数?

Private Struct 只能在类中第一个列出私有的情况下返回

为什么我不能在另一个类中调用静态方法?

使一个类或结构成为所有模板实例化类的朋友?

不能在派生类构造函数中实例化new属性

使用私有构造函数来防止类的实例化?

Outputstream是一个抽象类,因此我们无法实例化它。为什么为Outputstream类提供了默认构造函数?

类“ HubConnection”的构造方法是私有的,并且只能在类声明中访问

我可以通过其基类的默认构造函数实例化一个结构体吗?

C ++实例化对象,该对象在另一个没有指针的类构造函数中没有默认构造函数

为什么构造函数会在一个类而不是另一个类中捕获异常?

从另一个类使用私有类构造函数访问内部子类