随笔分类 -  C++

OOP、STL
摘要:多线程程序中为了防止线程并发造成的竞态,需要经常使用到Mutex进行数据保护。posix提供了phtread_mutex_t进行互斥保护数据。Mutex的使用需要初始化和释放对应(phtread_mutex_init() 和 phtread_mutex_destroy() 对应),上锁和解锁对应... 阅读全文
posted @ 2015-03-21 20:49 KingsLanding 阅读(1416) 评论(0) 推荐(0) 编辑
摘要:n后问题,解决思路:假设每个皇后占一行(且第i个皇后放在第i - 1 行),依次去尝试下一个皇后该放在该行的哪一列#include#includeusing namespace std ;class queen{ public : queen ()... 阅读全文
posted @ 2014-10-10 22:40 KingsLanding 阅读(472) 评论(0) 推荐(0) 编辑
摘要:多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调用哪一个函数。 具体来说就是:父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际子类的成员函数。在每个包含有虚函数的类的对象的最前面(是指这个对象对象内存布局的最前面)都有一... 阅读全文
posted @ 2014-08-09 21:57 KingsLanding 阅读(6887) 评论(0) 推荐(0) 编辑
摘要:Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自... 阅读全文
posted @ 2014-08-09 16:01 KingsLanding 阅读(12833) 评论(2) 推荐(1) 编辑
摘要:观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。抽象目标类别 此抽象类别提供一个接口让观察者进行添附与解附作... 阅读全文
posted @ 2014-06-21 09:20 KingsLanding 阅读(980) 评论(0) 推荐(0) 编辑
摘要:C++11 提供了新的获取系统时间的库函数,在获取时间的时候一般常用的是获取time since epoch,下面来看一下如何获取这个时间。 1 #include 2 #include 3 #include 4 #include 5 #include 6 constexpr int microSecPerSec = 1000000; 7 8 int main() 9 {10 std::chrono::time_point p1, p2, p3;11 struct timeval tv;12 int64_t mSecond;13 14 p2 = s... 阅读全文
posted @ 2014-01-24 23:53 KingsLanding 阅读(4718) 评论(0) 推荐(1) 编辑
摘要:原文地址:http://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threadsAvoiding and Identifying False Sharing Among ThreadsAbstractIn symmetric multiprocessor (SMP) systems, each processor has a local cache. The memory system must guarantee cache coherence.False sharing oc 阅读全文
posted @ 2012-12-23 20:25 KingsLanding 阅读(1597) 评论(0) 推荐(1) 编辑
摘要:设计模式分为三种类型,共23类。 创建型模式:单件模式、抽象工厂模式、建造者模式、工厂方法、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。Adapter(适配器模式):将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能... 阅读全文
posted @ 2012-09-30 20:37 KingsLanding 阅读(474) 评论(0) 推荐(0) 编辑
摘要:为什么要提倡"Design Pattern"呢?根本原因是为了代码复用,增加可维护性。那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principal,OCP)、里氏代换原则(LSP)、依赖倒转原则(DIP)、接口隔离原则(ISP)以及抽象类(Abstract Class)、接口(Interface)。开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法 设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。开放封闭原则 此原则是由"Bertrand Meyer" 阅读全文
posted @ 2012-09-30 20:35 KingsLanding 阅读(439) 评论(0) 推荐(0) 编辑
摘要:早上起来看微博,看到大神们又在关于C++的各种讨论,找相关知识来看看,搜到了这篇文章。Google有很多自己实现的使C++代码更加健壮的技巧、功能,以及有异于别处的C++的使用方式。1. 智能指针(Smart Pointers)如果确实需要使用智能指针的话,scoped_ptr完全可以胜任。在非常特殊的情况下,例如对STL容器中对象,你应该只使用std::tr1::shared_ptr,任何情况下都不要使用auto_ptr。“智能”指针看上去是指针,其实是附加了语义的对象。以scoped_ptr为例,scoped_ptr被销毁时,删除了它所指向的对象。shared_ptr也是如此,而且,s.. 阅读全文
posted @ 2012-09-01 07:46 KingsLanding 阅读(1667) 评论(0) 推荐(0) 编辑
摘要:记得C++ 沉思录上说过,如果数据成员有指针类型的,最好把三大函数补全,不然的话容易产生浅拷贝和内存泄露。这里给出一个简单的例子。#include #include #include #include using namespace std;class CDemo{public: CDemo():str(new char[1]) { str[0] = '\0'; cout * a1 = new vector(); a1->push_back(d1); coutfront().c_str()front().c_st... 阅读全文
posted @ 2012-08-28 22:39 KingsLanding 阅读(1214) 评论(0) 推荐(0) 编辑
摘要:#include <iostream>#include <stack>#include <queue>using namespace std;template<class DataType>struct BiNode{ DataType data; struct BiNode *left,*right; BiNode():left(NULL),right(NULL){}};template<class DataType>class BiTree{ public: BiTree() { root = Create();} BiTree( 阅读全文
posted @ 2012-08-25 15:33 KingsLanding 阅读(894) 评论(0) 推荐(0) 编辑
摘要:/* 注意C++ 的内存管理的复杂性 尤其是在merge() 之中,当融合之后如何保证被合并了的链表之后的对象的析构函数会出错,不会被delete两次 还有就是友元函数的模板写法*/#include <iostream>#include <typeinfo>using namespace std;template<class DataType>struct Node{ DataType data; Node<DataType> *next;};template<class DataType>class Linklist;templat 阅读全文
posted @ 2012-08-20 21:06 KingsLanding 阅读(742) 评论(0) 推荐(0) 编辑
摘要:复习effective C++ ,今天看到了"virtual 函数以外的其它选择",里面介绍了Strategy 模式的两种实现方式,也介绍了std::function 和 std::bind 函数等,结合这段时间学习的进行一个总结。首先还是先来回顾书上的内容:问题引入:一个游戏需要对其中人们生命值,健康状况进行监控计算,因此需要定义一个专门的函数,但是不同的人物的计算方式是不同的,也就是说这个函数需要不同的实现方式。可以使用多态,这是最基本的方法。实例:class GameCharacter {public:virtual int healthValue() const;/ 阅读全文
posted @ 2012-08-12 10:40 KingsLanding 阅读(912) 评论(0) 推荐(0) 编辑
摘要:C++ 沉思录也算是C++中的经典书籍,其中介绍OO思想的我觉得很好,但是全书中贯穿了handle,使用引用计数等,也有点不适合现代C++的设计思想。这里使用shared_ptr 智能指针改写了“句柄”这一章的程序,明显使代码量下降,而且管理方便。下面来看代码:#include <iostream>#include <memory>using namespace std;class Point{public: Point() : xval(0),yval(0){}; Point(int x, int y): xval(x), yval(y){}; Point(const 阅读全文
posted @ 2012-08-10 21:11 KingsLanding 阅读(1657) 评论(0) 推荐(0) 编辑
摘要:面向对象编程的三要素:数据抽象、继承以及动态绑定。这里讨论一个算术表达式树问题,如(-5)*(3+4)对应的表达式树为:我们希望通过调用合适的函数来创建这样的树,然后打印该树完整的括号化形式。例如:Expr t = Expr("*", Expr("-",5), Expr("+", 3, 4));cout << t << endl; 输出结果为:((-5)*(3+4))此外我们不想为这些表达式的表示形式操心,也不想关心它们内存分配和回收的事宜。从上面图我们可以看出,图中有两种对象节点和箭头。每个节点包含一个值—— 阅读全文
posted @ 2012-07-28 22:25 KingsLanding 阅读(2399) 评论(2) 推荐(0) 编辑
摘要:上一回讨论的句柄技术有一个明显的缺点:为了将句柄捆绑到类T的对象上,必须要新定义一个具有类型为T的成员对象的新类。这个毛病相当麻烦,如果想新设计一个类的句柄类,就需要新定义两个类。C++之父提到过一种定义句柄类的技术可以弥补这一个缺点,主要思想就是将引用技术从数据中分离出来,把引用计数放到句柄类自己的对象之中。class Handle{ public: // 和前面一样 private: Point *p; int *u;};这里不再有指向UPoint的指针,我们使用指向Point的指针和指向一个int的指针表示引用计数。使... 阅读全文
posted @ 2012-07-27 22:22 KingsLanding 阅读(576) 评论(0) 推荐(0) 编辑
摘要:第五章介绍了代理类,这个类能让我们在一个容器中存储类型不同但相互关联的对象。这种方法需要为每个对象创建一个代理,并要将代理存储在容器中。创建代理将会复制所代理的对象。 如果想避免这些复制该怎么做呢?可以使用句柄类。它允许在保持代理的多态行为的同时,还可以避免进行不必要的复制。 处于多态的环境中,我们可以知道对象的基类类型,但是不知道对象本身的类型或者怎么样复制这种类型的对象。 如果多个指针指向同一个对象,就必须考虑要在什么时候删除对象。不能太早也不能太晚,太早删除,就会有某个仍然指向它的指针存在,再使用这个指针就会产生未定义行为。删除得太晚又会占用本来早该另作它用的空间。 需要一种... 阅读全文
posted @ 2012-07-26 23:12 KingsLanding 阅读(1069) 评论(0) 推荐(1) 编辑
摘要:前言: OOP 的 意思 在我看来就是使用继承和动态绑定的编程方式。继承是一种抽象,它允许程序员在某些时候忽略相似对象之间的差异,又在其他时候利用这些差异。 C++ 程序员都应该知道,只有在程序通过指向基类对象的指针或基类对象的引用调用虚函数时,才会发生运行时的多态现象。 对象的创建和复制不是运行时多态的,这一点严重影响了类的设计。所以,容器——无论是类似于数组或者结构体的内建容器还是用户自定义容器类——只能获得编译时类型一致的元素值。如果有一系列类之间存在继承关系,当我们需要创建、复制和存储对象,而这些对象的确切类型只有到运行时才能知道时,则这种编译时的检查会带来一些麻烦。 通常,解... 阅读全文
posted @ 2012-07-25 22:49 KingsLanding 阅读(969) 评论(0) 推荐(1) 编辑
摘要:一. 你需要一个构造函数吗? 构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的特点:1.构造函数的命名必须和类名完全相同。2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。 有些内太简单,它们的结构就是它们的接口,所以不需要构造函数。但是一般情况下都需要构造函数来初始化成员变量。二.. 阅读全文
posted @ 2012-07-25 21:56 KingsLanding 阅读(314) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示