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。

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

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?