【问题标题】: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 中的同时解决此问题?

【问题讨论】:

    标签: c++ class constructor


    【解决方案1】:

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

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

    【讨论】:

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