??xml version="1.0" encoding="utf-8" standalone="yes"?> 本文主要讲解Qt是如何实现反,以及一点点反射使用的小心得?/p>
Qt反射内幕窥 详细内容 反射前期准备 得到注册的类成员变量 得到注册的类成员函数 讉KcL员属性(get,setQ?/p>
调用注册的函?/p>
反射应用 ȝ Qt反射机制是基于moc(meta object compiler)实现?在这里多插一句(可以说Qt所有C++没有的特性,几乎都和q个有关p)。但是需要注意的是Qt提供的反式基本的反,不支持类的反,q个与JavaQC#q是有差别的?/p>
通常C++的编译过Eؓ 预处?>~译->链接->q行 Qt~译的过E中Q有一个moc的过E?在Qt工程构徏q程中的qmake其实是q这个事的。moc->预处?>~译->链接->q行?/p>
在mocq程中,需要处理的事情如下Q?/p>
1?识别一些特D的宏Q_OBJECT、Q_PROPERTY、Q_INVOKABLE。。? 如果到q些关键字,Qt自然׃ȝ成对应的moc文g?/p>
2?slotQsignal自然也是如此?/p>
3?uidesignerQ同样也是在q个阶段处理? 1?首先得承于Q_Object,同时需要在class中加入Q_OBJECTQ但是Q_Object的构造函数默认是U有的不让ѝ? 在类中直接用Q_GADGET也可以实现反,。。。据说只能实现部分功能,目前我只实现到能遍历成员属性,函数Q但是不能访问其中的倹{? q个q程其实是定义QMetaObject的过E,具体见Qt源码 2?注册cL员变量需要用Q_PROPERTY Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是关键字 Type表示成员的类型(不支持自定义cdQ对Qt很多基本cd都支持); Member代表你给该成员另外v的名字,可以和变量名不同QgetQset是自己在C++函数里面定义的基本的讉K函数名,不需要写参数。直接上代码Q? 3?注册cL员函? 如果你希望这个函数能够被反射Q那么很单,只需要在cȝ函数声明前加入Q_INVOKABLE关键字? 例如Q_INVOKABLE int func( QString flag ); 主要思\是得到其元对象Q得到其元属性,然后p得到你需要的信息Q具体的讉K函数有name,type,需要注意的是得到的type是枚丑ր|q在Qt提供了typeToName的函敎ͼ你可以得到想要的Q例如不是空z的2Q而是”int”Q?/p>
和遍历类属性一_其实是Ҏ元对象,得到元函? 其中typeName代表q回cdQsignature只的是函数的原貌QmethodType代表函数的类型,在Qt中分Zc(槽,信号Q普通函敎ͼ?/p>
在这里用的是QObject的property() 和setPropertyҎQ来讉K成员信息。但是对于用Q_GADGET宏的c,是不能用这个方法的Q还在寻找解x法,基本思\当然是重写?/p>
调用注册的函?/strong>
//普通函数的调用 在MyClass中,我们定义了int func( QString flag );q个函数Q利用反的调用方式如上Q主要是理解invokeMethod的用法,其中Qt::DirectConnection是函数的执行方式Q分为(异步和同步)QQ_RETURN_ARG是返回参敎ͼQ_ARG是传入参敎ͼ需要按函数声明中参数的序依次传入QQt最多支?个参敎ͼ对于一般的应用没有问题。还有疑问,L步具见Qt强大的帮助文档?/p>
反射反射Q就我目前的认知水^来看Q通过使用字符Ԍ来实现函数的通用化调用,例如你可以利用反把很多函数攄到数l中Q实Cơ遍历,全部调用?/p>
目前我见到的大多是利用反来操作数据库,例如hibernateQ其实可以利用Qt的反,快速实现所谓的hibernate,(最q自q立实C一套,很方??/p>
q篇文章主要讲了如何使用Qt来实现反,在实用角度上来讲Q我们不需要了解Qt是怎么实现反射的,对于怎么用上面说的很清楚了。大家有什么的新的xQ希望能提出来,来电请咨?br />
<levard@gmail.com>
文章概览
Qt反射内幕窥
moc讲解
详细内容
反射前期准备
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(int Member1 READ Member1 WRITE setMember1 )
Q_PROPERTY(int Member2 READ Member2 WRITE setMember2 )
Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )
public:
explicit MyClass(QObject *parent = 0);
signals:
public slots:
public:
Q_INVOKABLE int Member1();
Q_INVOKABLE int Member2();
Q_INVOKABLE QString Member3();
Q_INVOKABLE void setMember1( int mem1 );
Q_INVOKABLE void setMember2( int mem2 );
Q_INVOKABLE void setMember3( const QString& mem3 );
Q_INVOKABLE int func( QString flag );
private:
int m_member1;
int m_member2;
QString m_member3;
};
得到注册的类成员变量
MyClass theObj;
const QMetaObject* metaObj = theObj.metaObject();
//1.遍历cȝ属?/span>
int propertyCnt = metaObj->propertyCount();
for ( int i = 0; i < propertyCnt; ++ i )
{
QMetaProperty oneProperty = metaObj->property( i );
cout << " name: " << oneProperty.name();
cout << " type: " << QVariant::typeToName( oneProperty.type()) << "\n";
}
得到注册的类成员函数
//2.遍历cȝ函数成员
int methodCnt = metaObj->methodCount();
for ( int idx = 0; idx < methodCnt; ++ idx )
{
QMetaMethod oneMethod = metaObj->method( idx );
cout << "--------begin-------" << "\n";
cout << " typeName: " << oneMethod.typeName() << "\n";
cout << " signature: " << oneMethod.signature() << "\n";
cout << " methodType: " << oneMethod.methodType() << "\n";
cout << "--------end---------" << "\n";
}
讉KcL员属性(get,setQ?/strong>
//3.使用反射
cout << "-------test property-----------" << "\n";
MyClass newObj;
newObj.setProperty("Member1", 66);
cout << newObj.property( "Member1" ).toString().toStdString() << "\n";
cout << newObj.Member1() << "\n";
cout << "--------end----------" << "\n";
int ret;
MyClass newObj;
newObj.setMember1( 20 );
newObj.setMember2( 50 );
QMetaObject::invokeMethod( &newObj, "func", Qt::DirectConnection,
Q_RETURN_ARG(int, ret ),
Q_ARG(QString, "+"));
反射的应?/strong>
ȝ
]]>
貌似好久没有自己写过blog了,对于自己q样一个健忘的人,文采又这么差的h来说Q正好借这个机会锻g下自q文字能力Q同时记录下学过的东ѝ?/p>
貌似用过C++也好久了Q碰到这个问题,开始确实感觉到无力Q最后还是搜索了下别人是怎么做的。据说是Adobe 07q的面试题?/p>
1、第一x大家都是Q既然不能被l承Q也是一旦承这个类之后Q类׃能被初始化?/p>
2、可能把cȝ构造函数私有化Q和单例有点像,但是q样cd不能正常使用了?/p>
3、实在无力,查了下,他们是通过使用虚承解册个问题的?/p>
对于虚承,具体资料见:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/
里面有一句话很重要:C++规定:把真正创建对象时所指定的类UCؓ是最zc?虚基cd对象是由最zcȝ构造函数通过调用虚基cȝ构造函数进行初始化?
具体实现代码如下Q?/p>
1: #include <cstdio>
2: #include <iostream>
3:
4: template<class T> class CFinal{
5: friend T;
6: private:
7: CFinal(){ std::cout << "CFinal()" << std::endl; }
8: ~CFinal(){}
9: };
10:
11: class CFoo : virtual public CFinal<CFoo>{
12: public:
13: CFoo(){ std::cout << "CFoo()" << std::endl; }
14: ~CFoo(){}
15: };
16:
17: class CBar : public CFoo{
18: public:
19: CBar() { std::cout << "CBar" << std::endl; }
20: };
21:
22: int main()
23: {
24: //CBar bar;
25: CFoo foo;
26: while(1){}
27: return 0;
28: }
当你创徏CBarӞ需要初始化CFinalQ但是你不是他的friendQ不能初始化Q上面标U)
如果你会问不要virtual行不行?
不行Q由于不要virtualQ你可以l过CFoo的friend讉K到CFinalQ但是有virtual׃同了Q你必须直接初始化CFinalQ这是C++的规定,避免多次初始化)
但是有个问题Qgcc不能~译通过Q在friend T出错Qvs2010没有问题Q希望知道的能给点帮助?/p>
参考文献:
http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/QC++实现不能被承的c)
http://www.notonlysuccess.com/ 国内搞ACM?/p>
http://www.keithschwarz.com/ 一个老外用STL实现的算法代?/p>
http://www.possibility.com/Cpp/CppCodingStandard.html CPP代码规范
http://blog.sina.com.cn/s/blog_5e6fd4290100nhxa.html
http://www.shnenglu.com/richardhe/archive/2008/03.html
http://www.cnitblog.com/linghuye/archive/2007/06/24/29007.html
3D游戏资料 http://www.shnenglu.com/flyindark/archive/2011/05/01/145475.aspx
OGRE http://blog.sina.com.cn/s/articlelist_1159765812_1_1.html
http://www.shnenglu.com/lovedday/ 3D知识
http://www.shnenglu.com/lai3d/
http://www.shnenglu.com/billhsu/
|络~程
http://www.shnenglu.com/Solstice/archive/2011/04/17/144378.html
昨天刚考完试,今天本来是要d验室的,但是想了惛_了又能干啥呢Q现在有点小qQ感觉自己L很晕QL被各U事情牵着d走。今天出去{了{Q本来是惛_SOHO望京看看的,但是L找不刎ͼ又不想问人,貌似我现在特别怕和别h说话Q然后又回来了。一个h在熙熙攘攘的人群中,漫无目的的走着Q观察者周围的人,都是Z生活疲于奔命Q有刚下班ؓ了回家的上班赎ͼ一脸的疲倦,也有Z回家的农民朋友,一看他们就是很节省Q貌DI着从老家带来的衣服,背着不知道被~补q多次的包Q但是从他们的脸上熾露出的笑容,一U收L感觉Q一U可以与家h团聚的喜悦,当然q有一帮到处游玩的q轻人,Q给我印象很q是一Ҏ侣,貌似在讨Z的h|那个女的义正a辞的_书是承蝲文化的蝲体,书本w是没有价值的Q?我在惌些话是很有道理,但是与其说这些,q不如好好的看基本书Q现在的我们以ؓ信息是知识Q那是错的,接收没有自己的思想的东西,和吃了被别人嚼烂的食物一P虽然貌似也能得到点什么,但是没有自己的参与,你还是不知道其中的各U滋呟뀂) 。在地铁上,今天貌似看见两个女生Q貌似是学生Q,一个拿着iphone5Q一看就是非LQ,但是另外一个女生的眼神l我留下了很q印象Q很大的眼睛QM是我喜Ƣ的那种cdQ很不好意思的多看了她几眼Q貌D人家发现了,囧囧。。。,q有今天出去l我的感觉,我现在特别不愿意怿别h的话Q纵使我知道那是Ҏ好的Q我q是希望L南墙?/font>
今天特别惨的是又到地铁里面警察查h了,哎我都不惌了每ơ出ȝ见都被查Q学生好么还是怎么的,N我长的象坏hQ那个警察凶扼杀Q还揪着我害怕我跑了Q查不查是我的自由,我不愿意配合Q再说也没犯啥事是吧。。哎q都W三ơ。。?/font>
2012Q对我来说是q_^淡EQ貌g没啥可以说的Q都是按预想的来的吧Q顺利毕业(虽然毕业设计实写的很挫Q,波澜不惊的在本校和北师之间选择了本校,然后来实验室干z,虽然很苦逼的大概做了4个多月,中途还上课什么的Q但是这个过E下来还是有点小收获的,虽然没有很高的收入,但是混口饭吃的钱q是有的Q感觉自己在目中,虽然起了作用Q但是还是没有很好的完成自己的Q务,主要是自己没有深入进去,做事情的Ҏ实不对Q碰到问题,gL没有很好的办法来解决q个问题Q有点像Q热锅上的蚂蚁一PQ感觉需要抓住媄响一个事情所有的因素Q枚举来排除每种可能可以了Q但是L很粗心的漏掉了很多的问题。感觉我们项目中的破H效应比较严重,比如大家的代码都不是很规范,很多需要改q的地方。研I生的学习,感觉自己一直不在状态,看着大家都在L态度Q我也开始Q貌似我对奖学金的诱惑貌g没那么强Q对成W也就那样了。貌D是q一q做的事情。。。?/font>
在生zMQ认识了一能朋友Q有比我?岁的大哥Q确实和我们不一PZh处事说话都很CQ这一点确实值得我们学习Q给我们讲了很多公司里面的事情,然我再一ơ的感觉刎ͼ技术什么的都是工具Q与Z合作也是很重要的,自己的各斚w的能力,表达能力真心得提升一下。还有就是n体,感觉自己来不把自己当回事了,真心得注意一下自qq方面的问题啦,q是是找个x友啊。值得一提是今年爬了些北京的山,什么凤凰岭、香山、蟒山、鹫峎ͼ都爬了下感觉不错啦?/font>
在技术上Q没有学什么新的技术,q是只是熟悉C++Q只是学会了单的QT下的~程Q所以未来的一q_我准备对我计机的基素养好好提升一下,感觉自己知道的很多东襉K飘在上面Q没有真心得沉淀下去Q今q的感觉是自q性的一面在减弱。自己弄了很多本书都没有开始看。。?Lq些没有必要q的事情。。?感觉自己很多以前会的东西都不会了Q好长时间没写blogQ感觉好多东西该记录的都没记录。。?/font>
未来2013q的计划Q?/font>
生活Q?/font>
1、至长胖个5斤吧Q?
2、爬北京5座山Q?/font>
3、去郊外走走Q如果有旉可以d他省逛逛。。?
4、但愿找个妹子, 臛_学会照顾人啊。。。锻Dp话的能力啊。。?/font>
5、锻Dn体啦。。?/font>
技术:
0、锻Dp决问题的能力Q?/font>
1、熟悉一门函数型语言Qpythonq是惛_?/font>
2、好好读一下《深入计机pȝ》,主要需要完成课后的几个实验
3、学习SICP
4、熟悉用LinuxQ特别是VIM使用Q必要的时候研M代码
5、数据结构和法Q准备从新来q,没事了参加个topcoder或者codeforces什么的Q至不能太靠后?/font>
6、徏立一个个人的博客
7、至写一个自qAPP应用Q或者写一个网l爬虫相关的东西吧(L感觉q玩意有点神奇)
一、前提安?/strong>
前提Q需要安装QTQ本介绍安装的是qt-sdk-win-opensource-2010.05.exeQ?
1?安装oracle客户端,本介l里面安装的路径为F:\app\CunchQ记作ؓORACELPATH
2?开始菜单中扑ֈ
如上图所CQt Command PromptQ?在这里QT已经把编译的环境导入Q下来我们只需要把工程加蝲q去Q?
3?打开上面的那个控制台Q开始设|相关目?
二、编?/strong> 下面?ORACLEPATH%需要换成自己安装oracle的相关目? Q?Q?讄include目录Q? set INCLUDE=%INCLUDE%;%ORACLEPATH%\product\11.2.0\client_1\oci\include Q?Q?讄LIB目录 set LIB=%LIB%;%ORACLEPATH%\product\11.2.0\client_1\oci\lib\msvc Q?Q?q入qt中oci的工E目? cd %QTDIR%\src\plugins\sqldrivers\oci Q?Q?开始qmake~译q程Qqmake oci.pro Q?Q?利用gcc的库q行~译Q?mingw32-make q样q译完成了
2、mmq是很仁慈的告诉你这是二战的时候的用的密码技术,baidu下就知道enigmaQ然后google下弄下原?/p>
q个的设计的核心是转子Q而且破译密码的关键就是知道初始的位置Q而且mml了ALI昄是最开始用的那?个{子的enigma
唯一让我U结的就是每个{子的映射表;其实知道不知道都没有关系?让我费了很多时?
3、下面讲下破解方法:
1、手动破解(也是mm最希望的,mm希望看到你的诚意啊,不过实很篏啊)Q?/p>
利用Paper Enigma MachineQ利用纸自制一个Enigma Machine q个是老外弄的实很赞啊, 只需一张A4U?/p>
具体参考请看:http://mckoss.com/Crypto/Enigma.htm 上面提供?原理和下载链?/p>
2、程序破解: 其实上面的那个网上也是有的(web版)http://startpad.googlecode.com/hg/labs/js/enigma/enigma-sim.html
3、破解的时候碰到困隄上搜索到的(赞这位朋友)Q?大必备工?/p>
1?a title="http://baike.baidu.com/view/15482.htm" >http://baike.baidu.com/view/15482.htm
2?a title="http://blog.renren.com/share/235993462/1219448923" >http://blog.renren.com/share/235993462/1219448923
3?a title="http://enigmaco.de/enigma/enigma.html" >http://enigmaco.de/enigma/enigma.html
4、我破解到的难处是ALI用完了后Q得到的明文里面有welcomeq个单词Q还有一堆的YYYYYYQ我怿我破解对了,但是没有惛_
用AZ BYq个关键的地?哎哎?/p>
5、接下来是用第二条映射表的提示信息Q把I格 Q等昄出来
6、破解完了竟然只有个weibo账号啊,郁闷啊,q去已经别无数的ggl强了先?/p>
7、希望大家破解愉快啊
8、晒下自q破解工具
9、当然大家也可以写程序啊Q本行啊
本h大四 211本科Q?专业是数字媒体专业,有一qC++目的经验,做过的项目主要是3D游戏相关的?同时有在西山居实习经历,后由于考研没有l箋。希望找一个工作,主要是做C++方向,能保证全职。不知道为啥Ҏbbs.gameres.com上的招聘信息Q在|上投几个简历,只有一个给了面试(在明天)Q?Zl自己多留下后\Q希望各位前辈们Q如果贵公司有合适的职位的话Q希望能留下贵公司的招聘邮箱?nbsp; 谢谢各位了?不胜感激Q!Q?nbsp; 可悲的情q在扑ַ作。。。?/p>
考研的过E:Ҏ来说考研是3个半月,其中q有几天休息的,其实也就?个月吧,自我感觉数学q行Q但是我太粗心容易算错,专业和英语我是一开始就复习了,政治我放C考前50天吧。由于没有固定的座位Q就q样每天背个包去打游凅R到最后感觉自己准备了80%吧,也许更少。不q让我对自己的专业有了更q了解?/p>
考研的那两天Qȝ来说q是不错的,晚上在宿舍,中午到我同学那去,q有同学的热情款待。不q这两天的睡眠还是很不错的,和高考比好多了?/p>
详细l过吧: 1.7P早晨6:30的闹铃响了,但我7:00才的爬了hQ我舍友上班提前出去了,l我发了个短信说下雪了,我还是很喜欢雪的Q幸好冬天没雨啊Q,我回复了一?#8220;瑞雪兆丰q?#8221;Q我的信心有来了一倍啊。接下来各种爽啊Q首先走到公交站収ͼ438到了,一个箭步迈上去Q?0分钟到北航。由于提前查了考场Q找C最优的路线Q所以还是很L的找C 教授Q我竟然在第二考场Q这辈子与二太有~了Q小?初中 高中 大学 都是带的二班Q没惛_q次又是二)Q以为和交大一h那种30人的考场Q没惛_是那U?10人的Q还是在北航的主楼的一个古老的报告厅(看样子是刚徏校的那会Q苏联模式的Q,在这样充满历史的气息的地方,我感觉太好了。第一天政治,p感觉不错啊,p一看乐观和悲观Q我想了会想了个乔布斯的例子Q感觉不错,考完回望了北航,感觉人生会从q里改写似的。第二天数学感觉打的不错Q但是会错很多,专业课感觉答的很挫啊。感觉考不上的可能性大了?/p>
ȝQ这ơ考研是h生的一ơ磨l吧Q得大于失,成功不仅仅是一个证书吧?/p>