implement_dyncreate,C++代码分析
本文目录索引
- 1,C++代码分析
- 2,关于vc问题
- 3,ithaca城市介绍?
- 4,directx有什么用?
- 5,C++ 中将构造函数,析构函数声明为private,protected
- 6,java里面成员变量可以直接赋值,为什么还要构造函数啊?
1,C++代码分析
这段代码应该出自候sir的>吧?其实只要在出现宏的地方用定义宏的那段文本去替换它,就会好理解得多。其实那本书上已经说得很清楚了,你自己仔细体会一下吧,我相信没几个人有充足的耐心跟你解释这几个宏到底是怎么运作的,要解释清楚得写很长的篇幅,语言能力表达不好的话,会把事情解释得越来越复杂。我当初看这种变态的宏时也觉得很痛苦,也在这里提问过,得到的回复是仔细看书吧。所以劝你不要希望别人跟你解释。既然想学MFC,就得痛苦一回,因为每个人都是这么过来的,学MFC没有捷径。有很多人会MFC但并不是很理解MFC里面的实现机制。其实理解这种机制是非常有好处的,除了这个动态创建对象外,还有像RTTI和消息映射机制都处理得非常高明,毕竟这些是MFC里的精华所在。至少本人是这样认为的。
宏当中的\就是表示换行。直到没有换行符的时候就说明这个宏定义结束。
2,关于vc问题
通过DECLARE_DYNCREATE宏来使用IMPLEMENT_DYNCREATE宏,以允许CObject派生类对象在运行时自动建立。主机使用此功能自动建立对象,例如,但它在串行化过程中从磁盘读取一个对象时,他在类工具里加入IMPLEMENT_DYNCREATE宏。若用户使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏,那么接着使用RUNTIME_CLASS宏和CObject::IsKindOf成员函数以在运行时确定对象类。若declare_dyncreate包含在定义中,那么IMPLEMENT_DYNCREATE必须包含在类工具中
3,ithaca城市介绍?
ithaca是在纽约州中心的一个小镇,Cayuga湖的南岸。是一个非常小的城镇,只有一个商场中心Mall。城镇人口大约3万,加上几所大学大约10万人口。一共有3所大学,其中常春藤联盟学校Cornell大学最出名了。属于温和型大陆性气候,冬天下雪,夏天偶尔很热。 ithaca的中文翻译是伊萨卡岛〔爱奥尼亚群岛之一,位于希腊西部爱奥尼亚海中,为希腊神话中 Ulysses 的故乡〕。 伊萨卡,现为纽约州汤普金斯县县首府,毗邻五指湖区之一卡尤加湖畔。是纽约州人口最少的都会去。 公元18世纪,美国纽约上州大部份地名明显受到早年移民带来的欧洲文艺复兴文化的影响,美国人怀着爱琴海的浪漫,在美国纽约上州中部五指湖区的群山环抱中建起一个名叫伊萨卡的温馨小镇,一座世外桃源,并在那里孕育了举世闻名的康奈尔大学。现为纽约州汤普金斯县县首府,毗邻五指湖区之一卡尤加湖畔。 纽约伊萨卡市区东北方向的山顶上,高居着"常春藤"八校中最年轻、规模最大的康乃尔大学,校园景色壮观,气势开阔,完全有别于东北部常见的拥挤校园。四周是原始的嶙峋山石和参天古木,到处有喧哗的溪谷瀑布和石拱吊桥;有山顶静谧的碧笔湖水,还有山脚带状的卡尤佳湖畔(五指湖之一)。自然环境之美,北美大学里堪称独一无二。
4,directx有什么用?
1、作用 DirectX是一种应用程序界面(api),可让以Windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。 2、举例说明 下面我们来举个例子说明Directx的作用:以前我们玩Dos游戏的时候,都必须设置声卡的品牌,然后再设置它的irq、i/o、dma,其中有一项设置不对游戏就发不出声。这部分设置不但让玩家伤透脑筋,对游戏设计者开说也非常头痛!因为游戏设计者做游戏之初便需要把市面上所有声卡硬件数据都收集过来,然后根据不同的api来写不同的驱动程序。 现在我们玩Windows游戏,并不会做这些设置,因为Directx提供了一个共同的应用程序界面,只要这个游戏是依照Directx来开发的,不管你是什么显卡、声卡、统统都能玩,而且还能发挥比Dos下更佳的效果。当然,前提是你的显卡、声卡的驱动程序也必须支持Directx才行。 3、Directx由许多api组成: 1)DirectDraw:这是Directx中非常重要的部分。它担任图形处理的关键。以往在实地址的Dos下设计游戏时,为了游戏速度的考虑,都让程序直接操作硬件。 2)DirectSound这是用来处理声音的api,除了播放声音和处理混音之外,还加强了3d音效,并提供了录音功能。前面所举的声卡兼容的例子,就是利用了DirectSound来解决的。 3)DirectInput这用来处理游戏的一些外围装置,例如游戏摇杆、gamepad、方向盘、vr手套、力反馈的各种设备等。以往要在Dos下用方向盘来玩赛车游戏,就要先调整好irq、dma等各种设置。而现在DirectInput则使这些设备与游戏配合良好,不需要做特别配置。 4)DirectPlay这是为了满足近来流行的网络游戏而开发的api,支持多通信协议,让玩家可以用各种连网方式来进行对战,此外也提供网络对话功能及保密措施。 5)Direct3D(D3D):d3d的大名相信谁都听过吧!对现在的游戏来说d3d实在是太重要了!由于3d游戏的兴起,各大厂商纷纷推出3d加速卡为了避免重蹈声卡的覆辙,微软从Directx3.0后加入d3d这个api,让3d游戏有一个共同的开发标准。这样当游戏再执行时若需要绘图时就会通过d3d向显卡驱动程序提出要求从而完成绘图。
5,C++ 中将构造函数,析构函数声明为private,protected
你提出这个问题,说明你已经对c++有所思考了。
从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。
对于protected的函数,子类的“内部”的其他函数可以调用之。
而对于private的函数,只能被本类“内部”的其他函数说调用。
语法上就是这么规定的,你肯定也知道的咯。
那么为什么有时候将构造函数或者析构函数声明为protected的或者private的?
通常使用的场景如下:
1。如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。例如:
class A
{ protected: A(){}
public: ....
};
calss B : public A
{ public: B(){}
....
};
A a; // error
B b; // ok
2. 如果将构造函数/析构函数声明为private,那只能这个类的“内部”的函数才能构造这个类的对象了。这里所说的“内部”不知道你是否能明白,下面举个例子吧。
class A
{
private:
A(){ }
~A(){ }
public:
void Instance()//类A的内部的一个函数
{
A a;
}
};
上面的代码是能通过编译的。上面代码里的Instance函数就是类A的内部的一个函数。Instance函数体里就构建了一个A的对象。
但是,这个Instance函数还是不能够被外面调用的。为什么呢?
如果要调用Instance函数,必须有一个对象被构造出来。但是构造函数被声明为private的了。外部不能直接构造一个对象出来。
A aObj; // 编译通不过
aObj.Instance();
但是,如果Instance是一个static静态函数的话,就可以不需要通过一个对象,而可以直接被调用。如下:class A
{
private:
A():data(10){ cout << "A" << endl; }
~A(){ cout << "~A" << endl; }
public:
static A& Instance()
{
static A a;
return a;
}
void Print()
{
cout << data << endl;
}
private:
int data;
};
A& ra = A::Instance();
ra.Print();
上面的代码其实是设计模式singleton模式的一个简单的C++代码实现。
还有一个情况是:通常将拷贝构造函数和operator=(赋值操作符重载)声明成private,但是没有实现体。
这个的目的是禁止一个类的外部用户对这个类的对象进行复制动作。
细节请看《effective C++》里面的一个条款。具体哪个条款不记得了。你自己去找吧。
6,java里面成员变量可以直接赋值,为什么还要构造函数啊?
Java类的成员变量在被修饰为public、protected和包访问权限时,可以在不同层次上直接给成员变量赋值。但是,赋值的前提是:必须存在持有成员变量的对象。而对象的初始化必须调用构造函数,所以构造函数是必不可缺的。至于使用构造函数还是直接声明时给成员变量赋值,那就要看情况而定。如果创建的这个对象是不可变的,那么就必须使用构造函数初始化成员变量,反之,就无所谓。另外,直接给成员变量赋值,Java是不推荐的,因为这样会破坏它的封装性。所以,建议在构造函数或提供setters方法对变量赋值。