【问题标题】:Why does passing a class as parameter requires a default constructor? [duplicate]为什么将类作为参数传递需要默认构造函数? [复制]
【发布时间】:2019-11-28 12:10:03
【问题描述】:

我定义了一个将自定义结构作为构造函数参数的对象 LogManager:

typedef struct{
    ...
} logSettings;

class LogManager
{
    public:
    LogManager(logSettings logsettings);
};

然后我定义另一个以 LogManager 作为参数的对象:

class Core
{
    private:
    LogManager m_logmanager;

    public:
    Core(LogManager logmanager);
};

Core::Core(LogManager logmanager){//error here
    m_logmanager = logmanager;
}

我的 IDE 给出错误“类“LogManager”不存在默认构造函数”。 没错,但为什么我需要一个默认构造函数? logmanager 已经是 LogManager() 类型。当我调用我的构造函数 Core(LogManager logmanager) 时,应该已经调用了 logmanager 的构造函数。我没有尝试创建新对象,只是获取对现有 LogManager 的引用。

我错过了什么?我对 C++ 还很陌生。

【问题讨论】:

    标签: c++ class constructor initialization default-constructor


    【解决方案1】:

    该问题与将对象作为参数传递给函数或构造函数无关。问题是你定义了数据成员m_logmanager

    class Core
    {
        private:
        LogManager m_logmanager;
    
        public:
        Core(LogManager logmanager);
    };
    

    它是在Core类的构造函数主体获得控制权之前使用默认构造函数创建的。

    像这样写构造函数

    Core::Core(LogManager logmanager) : m_logmanager( logmanager )
    {
    }
    

    最好这样声明

    Core::Core( const LogManager &logmanager) : m_logmanager( logmanager )
    {
    }
    

    【讨论】:

    • 那也行不通,因为LogManager 没有复制或移动构造函数,对吗? LogManager 中定义的唯一构造函数使用 LogSettings 参数
    • @DrosvarG 对于初学者,编译器会创建一个默认的复制构造函数。
    • 最好写成Core::Core(LogManager logmanager) : m_logmanager(std::move(logmanager)) {}
    • @LightnessRacesinOrbit 是的。但是会出现新的问题。:)
    猜你喜欢
    • 2020-04-23
    • 2012-09-15
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2012-11-14
    • 2012-12-25
    • 2011-04-17
    相关资源
    最近更新 更多