在java語言中,可以使用getObject(String)函數,從類名直接構建新的對象。
而在C++中是沒有這種機制的,Qt雖然提供了元對象機制,但只可以獲取對象的類名,不能反向構建。
這個問題我在百度上找了很多,但都沒有滿意的答案,索性翻出去google一下,終於找到了解決方法。
原文地址:http://www.mimec.org/node/350
代碼如下:
objectfactory.h
#include <QByteArray> #include <QMetaObject> #include <QHash> #ifndef OBJECTFACTORY_H #define OBJECTFACTORY_H class ObjectFactory { public: template<typename T> static void registerClass() { constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> ); } static QObject* createObject( const QByteArray& className, QObject* parent = NULL ) { Constructor constructor = constructors().value( className ); if ( constructor == NULL ) return NULL; return (*constructor)( parent ); } private: typedef QObject* (*Constructor)( QObject* parent ); template<typename T> static QObject* constructorHelper( QObject* parent ) { return new T( parent ); } static QHash<QByteArray, Constructor>& constructors() { static QHash<QByteArray, Constructor> instance; return instance; } }; #endif // OBJECTFACTORY_H
調用方法:
首先要注冊你的class:(必須繼承QObject並添加Q_OBJECT)
ObjectFactory::registerClass<MyObject>();
反射構建一個新對象:
MyObject* object = (MyObject*)ObjectFactory::createObject( "MyObject" );
作用:利用反射機制可以做很多事,例如,可以將反射與Qt的property相結合,實現hibernate框架(有空會再寫一篇博客介紹)。
不足:這種實現方法不可避免地需要“先注冊,后使用”,還達不到真正的反射,雖然可以在一個啟動函數中注冊所有的類,但還是比較麻煩的。
轉載請標明出處:http://www.cnblogs.com/ztzheng/p/4122975.html