C++
文章平均质量分 76
WalleFu
希望做一个思想自由的人, 通过自己的努力给家人提供一个舒适的生活条件,并有能力帮助和影响周围的朋友。
展开
-
C 语言部分实现面向对象的继承特性【重构】
重构版本:之前的一个版本中,在“子类”对象构造时,采用动态对象申请“父类”,然后在内存拷贝到“子类的对象”中,在“子类”的“构造函数”结束后,再让临时“父类”对象“析构”。对于本文中的例子,animal类更像纯虚基类,因此其仅仅提供接口就可以了,不用对齐分配动态内存。下面我对这个例子进行了重构。重构后的代码,仅仅附上修改的部分://animal_base.h原创 2014-08-20 09:46:13 · 881 阅读 · 0 评论 -
三种工厂模式的C++实现
原文链接注:以后写设计模式相关的博客当以此为标准,很清晰,多谢。引出工厂模式的设计问题◆ 1.为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题 n 多的子类继承自抽象基类,我们不得不在每次要用到子转载 2014-03-05 17:46:04 · 1110 阅读 · 0 评论 -
关于类成员函数中访问同类对象的私有成员
原址:http://wenku.baidu.com/view/4e13d5343968011ca300912c.html(注释: 为了尊重原作者,在不改变内容的前提下,我进行了格式和内容的编辑,增强阅读体验。这位兄弟的文章,挺全面的,不过也有一点啰嗦。好像这个文章的上传作者也在杭州工作,有机会联系下,一起讨论交流下C++的一些知识。)关于类成员函数中访问同类对象转载 2013-06-22 16:11:40 · 11020 阅读 · 6 评论 -
Programming Exercise: Game of Life (0.1 version)
上个周末参加GDCR2013,今年的题目还是Game of Life,通过一天的交流和联系,确实收货不少,今后考虑陆续以这个题目不断锻炼自己的编码能力,用一小时编写程序,然后总结并删除,然后增加限制条件,继续练习。此外,使用不同的语言练习也是一个很好的学习语言的方法。我也准备将这一题目作为2014年的重点,以强化编码能力的途径之一。#ifndef LIFE_GAME_H#defi原创 2013-12-16 12:05:34 · 886 阅读 · 0 评论 -
建立一个入口Makefile执行指定子目录中的Makefile
SUBDIRS = SUB_DIR_NAME_1 SUB_DIR_NAME_2.PHONY: allall: @list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Clean in $$subdir";\ (cd $$subdir && make);\ done.PHONY: clean clean: @list='$原创 2013-11-24 00:13:58 · 11137 阅读 · 1 评论 -
C++实现设计模式:Observer Pattern
This example demonstrates creating three separate observer classes and subscribes them for different combinations of the two messages defined by the MySubject class. Finally, the calls to subject.原创 2013-08-25 12:37:10 · 895 阅读 · 0 评论 -
人人都来写算法 之 移除字符串中重复的字符,时间复杂度要求O(n),空间复杂度O(1)
移除字符串中重复的字符,不能使用额外的缓存空间。字符串支持所有的ASCII码字符。注意: 时间复杂度要求O(n),空间复杂度O(1),可以使用额外的一个或几个变量,但不允许额外再开一个数组拷贝。分析:1. 时间复杂度为O(n)条件下,最佳的方法就是采用包含256个位置寻址的哈希表来表示ASCII码。但是条件中又限制只能使用几个变量,因此采用bit寻址的方法可能是最接近原创 2013-08-13 17:48:53 · 2120 阅读 · 0 评论 -
C++实现设计模式:Bridge Pattern
注:为了简要说明,类的成员函数均采用inline。#ifndef _DRIVE_GAME_H_#define _DRIVE_GAME_H_#include "DriveGameImpl.h"#include using std::cout;using std::endl;class DriveGame{public:原创 2013-08-25 09:54:56 · 978 阅读 · 0 评论 -
C++实现设计模式:Builder Pattern
注:为了更清楚的解释,类的成员函数均采用inline。#ifndef _BUILDER_H#define _BUILDER_H#include "Product.h"#include using std::cout;using std::endl;using std::string;class Product;class原创 2013-08-25 09:55:40 · 948 阅读 · 0 评论 -
C++实现设计模式: PIMPL IDIOM
I learned this from the book Professional C++. And code this example to deppen the this practical pattern.The whole design is very compact, and very practical. I think that it is very suitable for a原创 2013-08-16 17:21:35 · 1247 阅读 · 0 评论 -
C++实现设计模式: An extensible Factory Pattern example
I have read the book Api Design For C++, and I must say it is a masterpiece.There is a section to introduce the Factory Pattern, I think it is the best practical example for this pattern which I hav原创 2013-08-14 12:04:09 · 1014 阅读 · 0 评论 -
C++实现设计模式(前传) 之 你必须知道的构造函数
(我的英文其实也不是特别好,但是我坚持尽可能读原汁原味的英文资料,其实读英文更加利于你去理解C++技术。我会在每篇博客中顺带着把英文资料中常用的一些简称介绍一下。另外,我的建议是注释一定要使用英文,且使用简单明了的短句)构造函数(Constructor),资料中常用缩写ctor.主要包括:Defaulted Constructors:默认构造函数,Constructor原创 2013-04-17 20:43:59 · 1247 阅读 · 0 评论 -
人人都来写算法 之 在旋转数组中查找值并返回该值在数组中的位置
题目:一个数组有n个整数,对它进行升序排序,但是被旋转了未知次,给出一个O(logn)的算法找到特定值元素的数组下标。#include using std::cout;using std::endl;int search(int a[], int low, int high, int x){ const int notExsit = -1;原创 2013-08-09 17:53:06 · 1218 阅读 · 0 评论 -
C++实现设计模式: Factory 工厂模式
本来打算原创的,但是读到的这篇文章非常好的诠释了我比较常用的工厂模式,因此这一回翻译一篇来自Cale Dunlap的一篇文章,这里先谢谢Cale。原文链接:http://www.codeproject.com/Articles/363338/Factory-Pattern-in-CplusplusDefinition Basically a Factory翻译 2013-05-03 18:29:27 · 2081 阅读 · 1 评论 -
人人都来写算法 之 矩阵顺时针旋转90度,空间效率O(1),时间效率O(n*n)
给你一个矩形图片,假设每位像素是用整形标识,将图片位图顺时针旋转90度。空间复杂度O(i), 时间复杂度O(n*n)两种方案可以选择:1. 利用图片矩形的特性,将其剥洋葱一样,一层一层处理,每一层逐个将四条边顺时针交换;2. 先将图片上下翻转矩阵,所有元素再在沿着主对角线交换位置即可。(当然,也可以先沿着主对角线交换,再左右翻转矩阵)原创 2013-08-13 17:38:03 · 3734 阅读 · 0 评论 -
一个全局变量的编译错误引出的思考
现在,不管在很多公司,遇到一个追求完美编码的同行非常少了,很多都是能运行就行,或者直观自己使用方便就行。其实,我非常不喜欢使用全局变量,好的代码应该严格遵守开放封闭原则,而全局变量的定义显然破坏了这一原则。我采用的方法一般是在定义静态变量,并且针对这个静态变量提供对外的操作接口,这样外部函数如果需要使用这个变量,完全可以通过统一的接口来调用。但是,遗憾的是,我们代码中这样的全局变量非常普遍,而且要命的是,这种变量作为数据库存储大量的数据,很多不同的模块代码可以对其进行访问操作,风险很大。原创 2014-03-06 17:24:00 · 2028 阅读 · 0 评论 -
C++中概念区分:Overload, Override, Hide
区分:overload, override, HideOverload: 重载,指函数同名,但是参数个数不同、或者参数类型不同的多个实现。(如果参数相同但是仅仅返回值不同不是重载,编译器会报错。)编译器判断重载函数:第一步,是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数原创 2013-04-24 13:57:38 · 1454 阅读 · 0 评论 -
关于sizeof的误用问题
很多人对于sizeof函数的使用有误解,这里仅对这一点进行必要的说明,并且附带一个常见错误的代码例子原创 2013-12-06 23:01:49 · 2051 阅读 · 0 评论 -
Safe C++ 读书笔记:对基本数据类型进行封装,以编写更安全的C++代码
本文是根据 Safe C++, How to avoid common mistakes 中的例子总结而来。原创 2014-02-24 18:42:07 · 1469 阅读 · 0 评论 -
The Big Three Rule
When creating a value object, it is therefore essential that you follow the rule of “The Big Three.” This term was introduced by Marshall Cline in the early nineties and essentially states that原创 2013-08-09 09:49:37 · 746 阅读 · 0 评论 -
C 语言部分实现面向对象的继承特性
最近在研究Linux源码的时候遇到很多不曾见过的C语言用法,尤其是一些面相对象的特性。最熟悉的是C99标准,最新的C11标准没有仔细研究过,泛泛看了一下资料觉得也主要是增加了一些对多线程支持的特性,对于面向对象的特性应该没有。搜索了一下,找到一篇很好的文章。该文章采用C语言很灵巧的部分实现了面向对象的继承特性。遗憾的是源代码貌似有问题,对于struct的内存布局有错误,也编译不原创 2014-08-19 14:58:25 · 1001 阅读 · 0 评论 -
String class by C++
I spend three hours for this class today. It is a very interesting to consider the detail about how to make it more elegant. Now I will share with you guys, and expect for your comments.SelfStr原创 2013-08-15 15:08:57 · 1121 阅读 · 0 评论 -
C++实现设计模式: Factory Pattern
I have read the book Api Design For C++ recently, and I must say that it is a masterpiece.There is a section to introduce the Factory Pattern, I think it is the best practical example for this patte原创 2014-07-11 11:29:14 · 718 阅读 · 0 评论 -
人人都来写算法 之 快速排序
中午吃饭比较早,利用20分钟把快速排序写了下,以说明算法为主,采用int数组存储数据。后续可以在以下两点优化程序:1. 采用模板编程,支持通用数据类型;2. 采用函数指针或者函数对象决定排序方式。#include using std::cout;using std::endl;/** Quick Sort **原创 2013-06-09 12:20:25 · 906 阅读 · 0 评论 -
多线程编程练习:使用变量控制多线程调用顺序
注:和同事讨论一个多线程的问题,想到前几天看到的一个关于多线程编程的题目,简单实现了一下,在这里分享给大家。/* 题目:output "ABCABCABC": threadFunc_A just print "A", threadFunc_B just print "B", threadFunc_C just print "C".*/原创 2014-03-11 13:56:18 · 1199 阅读 · 0 评论 -
程序员与工匠精神
前几天和一个朋友聊天时说:我有强迫症,每次看到不符合自己审美的代码时,总想重构一下。朋友的观点与大多数人相仿,程序只要满足要求,运行正确就可以。在现实的工作中一样,每当看到一段优美且高效的代码,我总是喜欢多看几遍,满心的享受。但是我们产品中的太多代码让我这个代码洁癖“患者”看了非常的烦躁:1. 随便一个源文件都是上百行的函数,有些甚至超过500行(含空行和注释)。2. 大量没有必要的临时变量定义。3. 习惯性的把所有变量声明定义放到函数前面,一些大函数甚至超过20行都是函数局部变量的声明和定义。想想原创 2014-06-19 21:26:13 · 5393 阅读 · 0 评论 -
C++实现设计模式:Decorator Pattern
注:为了更清楚的解释,类的成员函数均采用inline。#ifndef _COMPONENT_H#define _COMPONENT_H#include using std::cout;using std::endl;class virtualComponent{public: virtual ~virtualComponen原创 2013-08-25 09:56:11 · 766 阅读 · 0 评论 -
为了保证系统安全性,请在析构函数中检查对象指针是否是在栈上申请
最近写过一个连锁酒店预订的一个小程序。和本文相关的部分代码摘录下来说明本主题内容 。如果连锁酒店系统是存储各个酒店的指针来管理的,那么我们一般都是希望new出一个酒店并且添加到连锁系统的酒店对象指针的容器中(本文中的容器是map)。那么你是否能保证添加的指针一定是在堆上申请的呢?似乎这不是连锁系统自身可以控制的。那么如果传入的是栈指针,而在连锁系统对象析构时,把它存储的酒店对象指针当成堆指针d原创 2013-07-12 08:10:13 · 1482 阅读 · 5 评论 -
【重构】人人都来写算法 之 矩阵顺时针旋转90度,空间效率O(1),时间效率O(n*n)
对之前的代码进行了重构,虽然使用指针操作二维数组在可读性上没有原来的二维下标访问清晰,但是为了消除重复也只能这样了。原文链接:http://blog.csdn.net/walle_love_eva/article/details/9951977原创 2014-03-11 17:54:11 · 1747 阅读 · 0 评论 -
利用<sstream> 将string代表的数值进行数值类型转换
很多时候我们需要将字符串代表的数值转换为数值类型,方法很多,这里介绍一种非常简单有效的方法。请看下面的函数实例,很简单不做赘述:string doubleToString(double inValue) const{ ostringstream ostrStream; ostr return ostr.str();}doubl原创 2013-04-16 14:54:09 · 888 阅读 · 0 评论 -
Something you need to know about INITIALIZATION LISTS in Constructor of C++
(今天和一个同事闲聊时,扯到这个问题,随手把自己的想法记录下来,后续慢慢补充)1. 必须使用初始化列表的场景:含有引用类型数据成员,必须在初始化列表中初始化;const数据成员,必须在初始化列表中初始化;继承关系中,父类没有默认构造函数,但是含有父类数据成员,子类初始化时必须显示的调用父类的构造函数,在初始化列表中初始化。2. 继承关系中原创 2013-06-05 10:19:38 · 938 阅读 · 0 评论 -
人人都来写算法 之 归并有序数组,(要求:利用原数组,且时间复杂度O(n)
题目:数组A空间大小为m+n,数组A中保存着n个以升序的整数元素。数组B中保存着m个升序的整数元素。请将数组B插入数组A中且使A仍有序,且时间复杂度最小。分析:因为数组已经有序,且数组A的空间刚好够存储插入的数组B,因此我们的思路是利用两个数组已经有序的特性,从大到小依次取出并比较和插入。下标变量 index_a 初始值为n-1,代表数组A的最后一个位置。原创 2013-05-04 15:32:03 · 1417 阅读 · 1 评论 -
栈上申请数组和堆上申请二维数组的简介(部分引用自Professional C++)
给你个做测试的同事讲C/C++中数组的使用,想到前段时间看的 professional C++中书里的例子,就拿来给他讲了下,效果还很好。这里引用过来,方便有类似问题的同学参考。Professional C++ 中的例子:栈数组:在栈上申请数组很方便,和申请一个一维数组一样,只要明确数组大小即可,当然C++暂时只支持N*M型的矩形数组。但是随着C++的发展,原创 2013-05-16 12:03:20 · 2289 阅读 · 1 评论 -
C++ 利用类的静态成员特性定义全局变量来存储信息
应用场景举例:很多时候我们的工程需要定义一些全局的变量来存储共享的信息,怎么做才能既优雅又实用呢?这里我们来介绍一种方法。假如工具需要把工具运行信息打印到控制台,你也许希望在运行异常的时候,在打印的最后打印所有的警告和错误,而不用在所有的打印Log中依次寻找,因此需要定义一个全局的变量存储每一个异常的信息,并在程序退出前统一打印一次。定义全局的map存储是一个方案,但是原创 2013-04-16 20:54:39 · 1583 阅读 · 0 评论 -
C语言风格的数位转换
和同事聊天,谈到C和C++的区别,想想前段时间写的一段程序,觉得是C语言函数风格的代表,贴在这里供大家参考:1. 将一个十进制数转化为二进制的字符 0x80 对应二进制为:10000000,即一个byte的最高位。static void SetBin(char* s, size_t n){ for (int i=0x80; i != 0; i = i>原创 2013-04-16 17:02:07 · 2164 阅读 · 0 评论 -
C++ Memory Leak Finder
注释:代码下载失败,等用过和分析之后再总结。http://www.codeproject.com/Articles/393957/Cplusplus-Memory-Leak-FinderC++ Memory Leak FinderBy Fredrik Bornander, 6 Jun 2012转载 2013-04-15 23:41:36 · 1452 阅读 · 0 评论 -
Ten C++11 Features Every C++ Developer Should Use
http://www.codeproject.com/Articles/570638/Ten-Cplusplus11-Features-Every-Cplusplus-DeveloperThis article discusses a series of features new to C++11 that all developers should learn and use.转载 2013-04-15 23:27:03 · 927 阅读 · 0 评论 -
Static Member of Derived Class
http://www.codeproject.com/Tips/573405/Static-Member-of-Derived-ClassIntroductionRecently I had a situation where I had a large number of classes all derived from a single base c翻译 2013-04-23 13:19:20 · 1112 阅读 · 1 评论 -
C++常见错误
1. 临时变量是常量,因此如果参数定义类型为&类型,则传递临时变量会编译错误;在求表达式值期间,编译器必须建立临时对象,它们需要存储空间、构造和删除,编译器负责决定他们的去留和存在细节。它自动的成为常量;2. const返回值:(1)返回类型是内置类型的const,则const返回值没有意义,编译器视其是一个值而不是一个变量,返回的这个变量值实际是副本;(2)返回类原创 2013-04-02 23:52:08 · 845 阅读 · 0 评论 -
C++ 字符串的一些操作
1.字符串长度查询: strlen() 和 wcslen()Finding the Length of a Null - Terminated String:The strlen() function returns the length of the argument string of type char* as a value of type size_t .原创 2013-04-02 23:45:48 · 756 阅读 · 0 评论