lxg7758258 2022-05-23 17:32 采纳率: 25%
浏览 60
已结题

单例类可以在全局函数里面调用吗?

问题遇到的现象和发生背景

在单例类头文件dbg_log_handler.h里面声明静态变量 m_dbg_Instance,在对应cpp dbg_log_handler.cpp里面定义这个静态变量 m_dbg_Instance.当我在全局函数调用这个单例类时,我发现每调用一次就构造一次.当我把这个静态变量的定义放在这个全局函数所在的cpp dbg_common.cpp里面时,则只构造一次,没有想明白为何会是这样子.

问题相关代码,请勿粘贴截图

dbg_log_handler.h

class DbgLogHandler final{

static DbgLogHandler& Instance() {
return m_dbg_Instance;
}

static DbgLogHandler m_dbg_Instance;

};

dbg_log_handler.cpp
DbgLogHandler DbgLogHandler ::m_dbg_Instance;
DbgLogHandler::DbgLogHandler()
: {

}

dbg_common.cpp
/m_dbg_Instance定义在这就构造一次,放在dbg_log_handler.cpp里面每调用一次info_log的接口就会构造一次这个单例,很奇怪/
int info_log(const char* format) {
DbgLogHandler& dbg = DbgLogHandler::Instance();
}

  • 写回答

5条回答 默认 最新

  • fortunely2 2022-05-23 19:18
    关注
    获得5.00元问题酬金

    不知道你是否有将构造函数、copy操作都设为private?
    只看你这一段代码并不能看出问题,如果可以,建议发出工程demo + 运行环境。我用的Win10x64 + VS 2022 就没问题,不会多次初始化单例模式。
    我比较怀疑是代码其他部分发生了构造、或者拷贝构造。

    或者你在你的PC上运行以下我改写的下面这段代码,将实例化延迟到第一次调用instance时,而不是程序启动时(进入main前)。
    看看调用info_log()还会不会导致单例模式多次初始化:

    // dbg_log_handler.h
    #pragma once
    #include <iostream>
    using namespace std;
    
    class DbgLogHandler final {
    public:
        static DbgLogHandler& Instance() {
            static DbgLogHandler m_dbg_Instance;
            return m_dbg_Instance;
        }
    
    private:
        DbgLogHandler()
        { // definition for Debug
            cout << "construct DbgLogHandler" << endl;
        }
    
        DbgLogHandler(const DbgLogHandler&) = default;
        DbgLogHandler& operator=(const DbgLogHandler&) = default;
        ~DbgLogHandler() = default;
    };
    
    
    // dbg_common.h
    #pragma once
    
    int info_log(const char* format);
    
    // dbg_common.cpp
    #include "dbg_log_handler.h"
    
    #include <iostream>
    using namespace std;
    
    int info_log(const char* format) {
        cout << "info_log" << endl;
        DbgLogHandler& dbg = DbgLogHandler::Instance();
        return 0;
    }
    
    // test.cpp
    #include "dbg_log_handler.h"
    #include "dbg_common.h"
    
    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << "enter main" << endl;
        //DbgLogHandler obj1 = DbgLogHandler::Instance();
        //DbgLogHandler obj2 = DbgLogHandler::Instance();
    
        info_log("A");
        info_log("B");
        return 0;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 赞助了问题酬金10元 5月23日
  • 创建了问题 5月23日

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘