JohnYork 2015-06-22 16:15 采纳率: 100%
浏览 1479
已采纳

如何控制各种类的静态成员对象的创建顺序?

想用C++实现类似Java的反射机制,参考网上的设计方案形成了如下代码:
基类声明和实现:
protocolui.h:

#ifndef PROTOCOLUI_H
#define PROTOCOLUI_H

#include<map>
#include <string>

class UIProtocolDev;
struct UIProtocolDevInfo;
typedef UIProtocolDev* (*_tfnCreateUI) (void);

class UIProtocolDev
{
   static std::map<std::string, _tfnCreateUI> m_uiInfoMap;

public:
   UIProtocolDev() {}
   virtual ~UIProtocolDev() {}

   static bool registerUI(UIProtocolDevInfo* pUiDevInfo);
   static UIProtocolDev* CreateUI(std::string type);
};

struct UIProtocolDevInfo {
   std::string    _type;
   _tfnCreateUI   _fnCreateUI;
   UIProtocolDevInfo(std::string const type, _tfnCreateUI fnCreateUI);
};

#endif //PROTOCOLUI_H

protocolui.cpp

#include "protocolui.h"

std::map<std::string, _tfnCreateUI> UIProtocolDev::m_uiInfoMap;

bool UIProtocolDev::registerUI(UIProtocolDevInfo *pUiDevInfo)
{
   if (pUiDevInfo == NULL) return false;
   m_uiInfoMap[pUiDevInfo->_type] = pUiDevInfo->_fnCreateUI;
   return true;
}

UIProtocolDev *UIProtocolDev::CreateUI(std::string type/*, QObject *parent, logstream::ILogHost * const logHost, const char *strIdentifier*/)
{
   if (m_uiInfoMap[type] != NULL) {
      return m_uiInfoMap[type](/*parent, logHost, strIdentifier*/);
   }
   return NULL;
}

UIProtocolDevInfo::UIProtocolDevInfo(const std::string type, _tfnCreateUI fnCreateUI)
{
   _type = type;
   _fnCreateUI = fnCreateUI;
   UIProtocolDev::registerUI(this);
}

继承类声明和实现:
uiprotocolserialport.h:

#ifndef UIPROTOCOLSERIALPORT_H
#define UIPROTOCOLSERIALPORT_H

#include "protocolui.h"
#include <QObject>
#include <string>

class Test : public UIProtocolDev
{
public:
   Test() {}
   virtual ~Test() {}
   static UIProtocolDev* CreateUI(void)
   { return new Test(); }
private:
   static UIProtocolDevInfo m_devinfo;
};
#endif // UIPROTOCOLSERIALPORT_H

uiprotocolserialport.cpp:

#include "uiprotocolserialport.h"
UIProtocolDevInfo Test::m_devinfo("Test",(_tfnCreateUI)(Test::CreateUI()));

main.cpp:

void main(void)
{
    UIProtocolDev * pdev = UIProtocolDev::CreateUI("Test");
    delete pdev;
}

使用MinGW-w64 4.9.2编译链接后,运行时报告程序崩溃;
尝试将uiprotocolserialport.h和uiprotocolserialport.cpp中的代码分别移动到uiprotocol.h和uiprotocol.cpp中后,程序正常执行并正常结束。
由此怀疑在继承类与基类不在相同的文件中时,MinGW-w64的GCC编译器没有正确的安排基类静态成员变量UIProtocolDev::m_uiInfoMap和继承类静态成员变量Test::m_devinfo的创建顺序,使得继承类的静态成员先于基类的静态成员创建,但由于继承类的静态成员构造函数在执行时需要使用基类的静态成员,这造成访问未初始化内存区的错误。
因此,请问:
1.如何控制不同文件之间各种类的静态成员对象的创建顺序呢?
2.若无法控制创建顺序,有没有变通的办法来实现类似JAVA的反射机制呢?

  • 写回答

1条回答 默认 最新

  • devmiao 2015-06-22 16:23
    关注

    参考《深入浅出MFC》
    MFC机制模拟之RTTI。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决