摘要: 通过上一篇文章,我在分析继承过程中对象的数据结构时,意外发现可以通过地址随意的访问对象的数据,无论是私有的还是公开的。于是做了以下实验,通过实验可以看出来,内存中的数据,只要不是在常量区,只要你能获得目标的地址,你就可以修改它,无论是在const函数中,还是某类的私有成员变量。代码: 1 #include 2 3 /*** 4 * @author:zanzan101 5 */ 6 7 // 测试如何在const函数中修改成员变量 8 class A 9 {10 private:11 int data1;12 int data2;13 public:14 A(): ... 阅读全文
posted @ 2013-11-03 20:30 铁甲小宝 阅读(681) 评论(0) 推荐(0)
摘要: 多重继承:非虚函数,两个基类存在满足覆盖条件的函数时,派生类无法调用其中任何一个函数。该条件只有一个要求:重名。无论返回值、参数、const类型如何,只要重名,即满足覆盖条件。虚继承:伴随虚继承衍生出来了虚基类的概念,当一个B虚继承了A时,A就是B的虚基类,虚基类的概念只存在于虚继承关系两个类之间,当此时C正常继承A时,A相对于C就不是虚基类。无论虚继承还是虚基类,都与虚函数无关。使用虚继承时,两个中间类都必须是虚继承于最基类,否则无论虚函数还是非虚函数,都会产生两份函数。正常使用方法:两个中间类虚继承与最基类,之后最派生类正常继承于两个中间类;两个中间类必须保证不同时覆盖某个虚函数或同时覆盖 阅读全文
posted @ 2013-11-03 20:27 铁甲小宝 阅读(496) 评论(0) 推荐(0)
摘要: 虚函数:覆盖的条件:同名 && 同参 && 同返回值 && 同const类型重载的条件:同名 && (不同参 || 不同const类型)非法的条件:同名 && 同参 && 不同返回值类型非虚函数:覆盖的条件:同名重载的条件:不能重载基类的函数,一旦同名,就会覆盖基类的函数,但是可以平级重载注意:覆盖只能发生在继承过程中,不是继承不能覆盖,出现非法重定义的错误。代码: 1 #include 2 3 /*** 4 * @author:zanzan101 5 */ 6 7 class A 8 { 9 pu 阅读全文
posted @ 2013-11-03 15:43 铁甲小宝 阅读(239) 评论(0) 推荐(0)
摘要: 抽象工厂简介:是一种创建对象的方法,当一个类簇的一种派生类对象需要被创建时,只需提供一个接口,并通过参数指定要创建的对象型号,该工厂即可返回该类型对象的指针。核心: 将客户和生产线分离。一般实现方法:l 工厂存在一个实例,提供N个接口供客户调用,每个接口负责一个类簇;l 工厂依赖全部基类和派生类,并为每一个类簇提供一个接口,当存在N个类簇时,提供N个接口;l 客户依赖全部基类,如非特殊情况,客户不依赖派生类;l 如果需要添加新的类簇,需要修改:工厂生产方法,工厂接口函数,客户的依赖关系。优点:l 访问该工厂的客户只需要知道自己想要的对象的基类和一个型号参数,即可得到正确的对象,操作简单。l 分 阅读全文
posted @ 2013-11-02 21:38 铁甲小宝 阅读(221) 评论(0) 推荐(0)
摘要: 正确的使用设计模式可以减少条件语句,减少代码量,提高复用性。错误的使用,则起不到那样的效果。下面的例子,本想使用策略模式,封装是封装了,可以还是用的状态模式的思路,导致最终没有起到优化的目的。原因还是选错了模式。代码: 1 #include 2 3 /*** 4 * 一个非常不恰当的使用设计模式——策略模式的例子 5 * 看起来就是状态模式和策略模式的杂交,还是畸形 6 * @author:zanzan101 7 */ 8 9 10 class Move 11 { 12 public: 13 // 重载()运算符,使之成为仿函数 14 virtual... 阅读全文
posted @ 2013-11-01 10:52 铁甲小宝 阅读(260) 评论(0) 推荐(0)
摘要: 问题定义:两个字符串A和B,长度分别为M和N,用这两个字符串组成长度为M+N的字符串S,要求S中来自A的字符满足其在A中的排列顺序,S中来自B的字符满足其在B中的排列顺序。分析:下面的采用了两种方法,第一种方法采用类似于全排列的迭代+递归的方法,实现略困难,第二种方法采用类似于全组合的0-1双递归方法,思路更清晰明朗。为了故意压缩代码量,算法中没有标明注释,两种方法的核心代码都是15行。代码: 1 #include 2 #include 3 #include 4 5 /*** 6 * @author:zanzan101 7 */ 8 using namespace std; 9 10 ... 阅读全文
posted @ 2013-11-01 09:55 铁甲小宝 阅读(876) 评论(0) 推荐(0)
摘要: 写了一小段代码:练习一下友元类和友元函数的声明和使用;练习一下最简单的快排算法;练习一下递归的方法处理全排列问题。代码: 1 #include 2 #include 3 4 class Something; 5 6 // 友元函数可以提前在类外定义,也可以不这么做 7 int get_data(Something& sth); 8 9 class Otherthing; 10 class Something 11 { 12 private: 13 int data; 14 15 // 友元类定义的位置在private,public,protecte... 阅读全文
posted @ 2013-10-31 10:12 铁甲小宝 阅读(272) 评论(0) 推荐(0)
摘要: 题目定义:输入为合法的整数四则运算表达式,不带括号,编程计算表达式的运算结果。思路:先设计程序流程图,之后打印出流程图,根据流程图编程实现代码。程序流程图:代码: 1 #include 2 #include 3 4 using namespace std; 5 6 int get_int(const char* &p) 7 { 8 int tmp = 0; 9 while(*p >= '0' && *p stack_value; 49 stack stack_oprtr; 50 while(true) 51 { 52 ... 阅读全文
posted @ 2013-10-30 23:58 铁甲小宝 阅读(1198) 评论(0) 推荐(0)
摘要: 最近认真学习了一下设计模式中的一个比较简单的:状态模式,并用它设计了一个极其简单的“登录过程”的代码。状态模式的优势:当系统中存在的状态很多(一般>=4),但状态的相互跳转并不复杂,即每个状态的出度较少(一般为1~3),这种情况下适合用状态模式;状态模式下,状态之间的跳转由状态对象自己负责,每个状态自己知道且只知道自己的跳转方法,这样设计起来简单,系统不需要同样管理状态之间的跳转。状态模式的优点在于能方便的进行状态之间的跳转,修改状态调整规则,以及扩展新的状态;收获如下:要使用设计模式来设计系统的话,需要先画出UML图来,或者是类似的图,比如使用状态模式,就应该先画出类图(静态图)和状态 阅读全文
posted @ 2013-10-30 11:59 铁甲小宝 阅读(263) 评论(0) 推荐(0)
摘要: 结构体列表:WSADATASOCKETSOCKADDR_IN函数列表:WSAStartupsockethtonlhtonsbindlistenacceptsendrecvclosesocket代码: 1 #pragma comment(lib, "wsock32.lib") 2 #include 3 #include 4 #include 5 6 /*** 7 * @author:zanzan101 8 */ 9 10 static HANDLE event_server = CreateEvent(0, 0, 0, "server_event"); 1 阅读全文
posted @ 2013-10-25 23:50 铁甲小宝 阅读(393) 评论(0) 推荐(0)