HGE 简单对话框组件
采用直接贴图的方式,因此固定了图片和大小。
带姓名框的对话框…… = = 待完善
图片、字体路径需要自己修改。
创建方法是CDialog* pDialog = new CDialog(id, messages); 其中id是控件ID(不要重复),messages是queue< pair<string, string> >。第一项为姓名,第二项为文字。然后交给gui去处理。详细看demo、、、
HGE 按下任意键监听
使用HGE::Input_GetKey()函数即可,判断返回值不为NULL,即可执行对应操作。
* 包括鼠标按键(左/右/中)和键盘上所有HGE可以监听到的键(详细查看HGE的API)。
HGE粒子系统DEMO
一个粒子系统的简单demo,移动鼠标可以移动粒子发射点,单击鼠标左键发出音效。
版本:HGE 1.8.1
开发平台:Visual Studio 2005
HGE基本DEMO
一个简单的显示粒子纹理图片、播放音效的DEMO(还没有涉及粒子系统 = =)。
版本:HGE 1.8.1
开发平台:Visual Studio 2005
VS2005:cannot open file 'LIBC.lib'
单击项目->项目属性->配置属性->链接器->输入->忽略特定库,输入LIBC.lib即可。
原因是Visual C++ 2005不再支持单线程的CRT库(LIBC.lib)
【20090824】C++培训日记-STL扫盲
今天是几个常用容器的基本使用。。于是放几个DEMO上来:
包括 vector, deque, list, map, multimap, set, multiset, stack, queue,以及较少用到的valarray, bitset, priority_queue
通过虚函数表访问private成员
通过虚函数表可以访问到对象的布局,通过函数指针可以运行函数,不论是private还是public,于是单继承、非virtual的demo如下:
-
#include <iostream>
-
-
class A
-
{
-
public:
-
A(): x(5) { }
-
-
private:
-
virtual void fun() { std::cout << "A::fun()" << std::endl; }
-
-
private:
-
int x;
-
};
-
-
class B: public A
-
{
-
public:
-
B(): y(3) { }
-
-
private:
-
virtual void fun() { std::cout << "B::fun()" << std::endl; }
-
-
private:
-
int y;
-
};
-
-
typedef void (*Fun)();
-
-
void PrintVTable(Fun* pVT)
-
{
-
Fun* pFun = pVT;
-
while( *pFun )
-
{
-
(*pFun)();
-
pFun ++;
-
}
-
}
-
-
void PrintMembers(int* pMembers)
-
{
-
std::cout << *pMembers << std::endl;
-
}
-
-
void PrintVTableAndMembers(B* ptr)
-
{
-
int* pAddress = (int*) ptr;
-
PrintVTable((Fun*) *pAddress);
-
pAddress ++;
-
-
PrintMembers(pAddress);
-
pAddress ++;
-
-
PrintMembers(pAddress);
-
pAddress ++;
-
}
-
-
void main(void)
-
{
-
B b;
-
-
PrintVTableAndMembers(&b);
-
-
system("pause");
-
}
如果是多继承 或者 继承方式用virtual,对象的布局是不一样的,可以参考下本文:http://yoyo.is-programmer.com/posts/10671.html
多重继承的虚函数表与类型转换
总结:
- 非virtual继承:
进行隐式转换或进行显式转换均可时(代码中简写为隐式强转),最左父类指针指向子类时指向地址不变,其他父类指针指向子类时指向地址需要偏移,根据指针的类型对虚函数进行地址偏移(访问指针类型对象的虚函数表)。
必须进行显式转换时指针指向地址均不变,按照强制转换前的类型对虚函数进行地址偏移(访问原来类型的虚函数表)。
但是它们的实际函数都是访问子类的实际虚函数。
- virtual继承:
进行隐式转换或进行显式转换均可时(代码中简写为隐式强转),指针指向子类时指向地址均需要偏移,根据指针的类型对虚函数进行地址偏移(访问指针类型对象的虚函数表)。
必须进行显式转换时指针指向地址均不变,按照强制转换前的类型对虚函数进行地址偏移(访问原来类型的虚函数表)。
但是它们的实际函数都是访问子类的实际虚函数。
virtual继承与非virtual继承的差别其实仅在于不需要显式转换时的最左父类指针是否偏移。这与当时的虚函数表布局方式有关。
virtual继承将新的virtual方法都写在自身vftable中; 而非virtual继承则将新的virtual方法更新到最左父类的vftable中。