如何防止类中的类对象尝试在没有默认构造函数的情况下自动构建自身?

Posted

技术标签:

【中文标题】如何防止类中的类对象尝试在没有默认构造函数的情况下自动构建自身?【英文标题】:How to prevent class object inside a class to try constructing itself automatically without a default constructor? 【发布时间】:2019-11-23 12:37:11 【问题描述】:

我有下一节课:

#include "OutStream.h"
#include "FileStream.h"

class Logger

    OutStream _os;
    FileStream _fs;
    bool _logToScreen;
    static unsigned int _line;

public:
    Logger(const char *filename, bool logToScreen);
    ~Logger();

    void print(const char *msg);
;

OutStream 类有一个默认构造函数,但FileStream 类没有默认构造函数。 当我尝试为Logger 编写构造函数时,我收到一条错误消息,提示“类'FileStream' 不存在默认构造函数” 这是 Logger 构造函数的代码,我也在其中构造 _fs:

unsigned int Logger::_line = 0;
Logger::Logger(const char* filename, bool logToScreen)

    // Opening the given file in the FileStream class
    _fs = FileStream(filename);
    // Declaring the value of _logToScreen
    _logToScreen = logToScreen;

如何在将 _fs 保留在 Logger 中的同时解决此问题?

【问题讨论】:

【参考方案1】:

使用 mem-initializer-list。像这样定义构造函数

Logger::Logger(const char* filename, bool logToScreen) : _fs( filename ), _logToScreen( logToScreen )


【讨论】:

谢谢!那行得通。我做的和你建议的有什么区别? 不同的是,这种方法直接构造成员,而您的方法默认-先构造它们,然后在构造函数体中分配给它们。 @0xBlackMirror 然后构造函数的主体获得控制,其所有子对象都已构造。因此,您可以在体内处理赋值运算符。 I当使用 mem-initializer 时,则使用指定的初始化器构造相应的子对象。

以上是关于如何防止类中的类对象尝试在没有默认构造函数的情况下自动构建自身?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不调用 .Result 的情况下使用作为任务注入的类中的函数?

[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载

子父类中的构造函数

一个类中可以没有构造器

04-JAVA中的类和对象

编译器自动生成默认构造函数的四种情况