zoukankan      html  css  js  c++  java
  • 一个适用于任何继承于QObject的类的创建工厂

     1 class ObjectFactory
     2 {
     3 public:
     4     template<typename T>
     5     static void registerClass()
     6     {
     7         constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
     8     }
     9  
    10     static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
    11     {
    12         Constructor constructor = constructors().value( className );
    13         if ( constructor == NULL )
    14             return NULL;
    15         return (*constructor)( parent );
    16     }
    17  
    18 private:
    19     typedef QObject* (*Constructor)( QObject* parent );
    20  
    21     template<typename T>
    22     static QObject* constructorHelper( QObject* parent )
    23     {
    24         return new T( parent );
    25     }
    26  
    27     static QHash<QByteArray, Constructor>& constructors()
    28     {
    29         static QHash<QByteArray, Constructor> instance;
    30         return instance;
    31     }
    32 }; 

    使用这种途径,不在需要使用Q_INVOKABLE声明构造器了,而且如果没有找到合适的构造器,只要这个类注册了,在constructorHelper()方法中就会报告一个编译错误。而且代码很容易使用:

    1 ObjectFactory::registerClass<Foo>();
    2  
    3 // ...
    4  
    5 QObject* foo = ObjectFactory::createObject( "Foo" );

     同时也很容易修改这个代码,来适用于那些不从QObject继承的自定义抽象类,例如它可以使用任何传递给registerClass()方法或者自动从类的静态成员接收的类型的“Key”,而不是使用从OMetaObject接收的类名作为“Key”.根据需要还有一组不同的参数可以传递给构造函数。

  • 相关阅读:
    「训练反思18」 (8.16) 认清自己
    「训练日志17」 (8.12) 崩盘
    「训练日志16」 8.11 下坠
    「训练日志15」 (8.10)
    「训练反思15」(8.10)
    「训练日志14 」(8.9) 失败
    训练日志13 (8.7)
    Linux 设置vim指令
    训练日志12 (8.5)
    训练反思12 (8.5)
  • 原文地址:https://www.cnblogs.com/eliu/p/9790654.html
Copyright © 2011-2022 走看看