03 2014 档案
摘要:TCHAR *ptch = TEXT("This is a const string.");如果使用UNICODE字符集, 则TEXT("This is a const string.")相当于L"This is a const string.", 如果使用ASCII集, 则上述字符串相当于“This is a const string.”。这样, 写的程序既可以使用UNICODE, 也可以使用ASCII, 增强了移植性。在写windows应用程序时, 如果您不确定使用UNICODE还是ASCII好, 那么推荐您使用TCHAR来替代程
阅读全文
摘要:功能:将数据格式化到字符串中原型:int sprintf( char *buffer, const char *format, [ argument] … );返回值是这个字符串的长度上次我企图这样用char* d;int s = 88;sprintf(d, "%d", s);这样是错误的:原因是d没有分配内存但这样可以char d[20];int s = 88;sprintf(d, "%d", s);但看sprintf的原型,我更相信,d相当于int const*,c++好像将const赋给非const,这个就已经分配内存了,所以可以使用sprintf
阅读全文
摘要:1.开启服务命令services.msc2.删除服务sc delete "服务名"
阅读全文
摘要:barrier:栅栏的意思,当barrier bar(3),这三个线程会放到栅栏中,等第三个线程执行时一起唤醒,然后返回barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable // Exposition only 2 { 3 public: 4 // construct/copy/destruct 5 barrier(size_t n); 6 ~barrier(); 7 8 // waiting 9 bool wait();10 };barrier类为我们提供了这样一种控制线程同步的机制...
阅读全文
摘要:1相关理念(1)类名条件变量和互斥变量都是boost库中被封装的类。(2)条件变量条件变量是thread库提供的一种等待线程同步的机制,可实现线程间的通信,它必须与互斥量配合使用,等待另一个线程中某个事件发生后本线程才能继续执行。(3)互斥变量互斥量是一种用于多线程编程的手段,它可以在多线程编程中防止多个线程同时操作共享资源[或称为临界区]。思想为:在每个线程开始的第一条语句使用获取互斥变量“锁有权”的语句,一旦一个线程[线程1]锁住了互斥量,那么其它线程只有等待线程1解锁互斥量后且另一线程[线程2]又获取到互斥变量的“锁有权”后才能运行这个线程[线程2]后面的代码。(4)互斥量有可能的缺点[
阅读全文
摘要:进程中线程同步的四种常用方式:1、 临界区(CCriticalSection)当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。具体应用方式:1、 定义临界区对象CcriticalSection g_CriticalSection;2、 在访问共享资源(代码或变量)之前,先获得临界区对象,g_CriticalSection.Lock();3、 访问共享资源后,则放弃临界区对象,g_CriticalSection.Unlock(); 2、 事件(CEvent)事件机制,则允许一
阅读全文
摘要:STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators(迭代器)。 input output \ / forward | bidirectional | random access ...
阅读全文
摘要:std::shared_ptr m_spThread;m_spThread.reset(new std::thread(std::bind(&GameServer::process_thread, this)));void GameServer::process_thread(){try{proce...
阅读全文
摘要:举个例子:sendmessage()同步,postmessage()就是异步的而对于阻塞与非阻塞个人认为是一种程序的状态,如果调用的函数或者操作不能返回就被阻塞住了,如果能立即返回就不阻塞了,细节可以看看操作系统。注意阻塞和sleep一样都会让出cpu给别的线程执行。
阅读全文
摘要:thread detach, join线程有两种状态,joinable或者detachable,pthread默认创建的线程是joinable的,也可以指定atrribute创建成一个detachable的线程。一个线程被创建后,最终一定要调用join或者detach(或者设置成detachable),以保证最后线程的资源会得到回收。对于一个joinable的线程,join它后要等到它执行结束,调用线程才能继续向前运行。如果调用线程既希望被创建的线程资源回收,又不会被阻塞在join,那怎么办呢,调用detach,让其自动回收。join:主线程被阻塞 detach:会分离,子线程自动回收资源
阅读全文
摘要:进程三个基本状态:就绪、阻塞、运行这个比较简单,进程创建后进入就绪状态、然后若CPU空闲或能打断CPU正在执行的进程(优先级低的),那么就绪状态转换成运行态,运行时,进程需要用到其他资源,但不能立即获得的话,那么运行太会转换到阻塞态,等待资源的获取,当资源获取后,阻塞太就会转换成就绪态,然后看CPU情况而定是否转换成运行态,进程执行完后就转换成了停止态。五状态(多了就绪挂起和阻塞挂起)这种不是太确定,至于什么是挂起,从网上没有搜到太明确的说明,有一种说明是进程从内存中调到了外存中(页中断)。上个图说明吧。这里关键是不知道为什么扶起,至于是不是内存调试的原因,还有待进一步查资料。在五状态中,对于
阅读全文
摘要:经常看到线程中用sleep(),到底是什么用处,下面讲的比较通俗:我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?我们先回顾一下操作系统原理。操作系统中,CPU竞争有很多种策略。Uni
阅读全文
摘要:void f(int p*)void f(int p[])void f(int p[4])对于传递数组类型的参数,一直很晕,其实以上三者是相同的,c语言中不能传递数组,只能传递第一个元素的地址,所以c语言在函数中没有数据越界方面的保护机制,所以可以额外的传递一个表示大小的参数,还可以这样void f(int (&p)[12]),这个p表示指向数组的指针,数组大小是12,我是这样理解的。数组有两个特殊的性质。一是不能复制数组;二是使用数组名字时,数组会自动转化为指向其第一个元素的指针。由于数组不能复制,所以无法编写使用数组类型形参的函数,因为数组会被自动转化为指针。 数组形参是个容易出问
阅读全文
摘要:1.char *s1 = "ssss";2.char s2[] = "bbbb";对于第一种,我是无法理解,无法想象字符串赋值给一个char类型的指针,查了一番貌似这样,不是把字符串的指针给s1,而是字符串第一个字符的地址,对于c标准库的string.h的函数strcpy(char *dest,const char* src),好像也能把第二个参数以""这样的字符代替,估计取得也是第一个字符的首地址,"ssss"存储在程序的常量区,不可变,指针在栈中,可以变,这种关系很微妙2.第二种完全是数组,但s2是不能改变的,
阅读全文
摘要:int a[3],这个a到底是什么?每次遇到c语言的这些东西,总是把我绕一把,搞的晕网上说法很多,暂时理解:首先他不是一个指针(网上也有说他是int const*),是个常量,他的值和&a[0]相等,也指向了数组的第一个元素,&a是数组的地址,数组的地址真好和数组的第一个元素的地址相等,所以&a = &a[0],反正记得是第一个元素的地址就行了,所以才能通过a[8],这样同偏移量寻址,知道第8个元素
阅读全文
摘要:这个问题总是讨论,有时又被弄晕了,特来复习一下int i = 0; int s = ++i+4; cout<<s<<endl;cout<<5,而i+++4返回4,其实这样的i++先运算,再加,++i先加再运算,就是这样而马上想到i+++i多少?其实这个测试是0,其实这个与顺序点和求值顺序有关:具体看这个:经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4,而不是4和5:a = 4; cout << a
阅读全文
摘要:std::shared_ptr:多个指针指向同一对象,一起操作没问题,意思是你可以把这个指针复制给别人,最后一个指针退出时,对象自动清除std::bind返回函数指针,std::function m_timeout_disconnect; 返回值void ,一个参数是__int64类型的m_timeout_disconnect =std::bind(&GameServer::timeout_disconnect, this, std::placeholders::_1);std::placeholders::_1:表示调用函数对象的第一参数,如m_timeout_disconnect(
阅读全文
摘要:想起了原来和我哥去放牛的事,很多次和我哥去放牛,那时候还是每家临着放,我家是三天,每次买点吃的冰棒,或者带副牌教我打,或者钓鱼,有时候到他旁边的同学家玩,想想那段时间确实很快乐,自从大学毕业以后,我想想我的最快乐的时光已经过去了,但我的青春又才刚刚开始,这是个蛋疼的问题。
阅读全文
摘要:多个线程是“同时”执行的多个任务;定时可以看作是在本线程内插入的任务。如果需要多个任务同时执行,就要用多线程;如果需要每隔一段时间做某件事就用定时。多线程相对复杂一些,占用系统资源略多一些,所以如果能不用多线程时尽量不用。定时器和多线程没啥关系,定时器是一个线程中的任务
阅读全文
摘要:在使用MongoDB的时候,经常会用到MongoDB的删除操作,以下是我在使用MongoDB删除操作的总结 首先是删除用户: db.removeUser("用户名") 其次是删除数据库: db.dropDataBase() ,这个操作会删除你当前正在使用的数据库。 然后是删除集合: db.集合名.d...
阅读全文
摘要:#include//ECHO.CPPvoid main(int argc,char *argv[]) { for(int i=0;i<argc;i++)cout<<argv[i]<<'\t'; cout<<'\n';} int argc;//表示读入字符串个数char *argv[];//指针数组,用来存放读入的字符串程序的意思逐个输出所有读入的字符串,每个字符串间空一个制表符间隔
阅读全文
摘要:原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。如果要指定大小使用char* strncpy( char*dest, char*src, size_tnum );
阅读全文
摘要:详细使用网址:http://blog.csdn.net/xinghebuluo/article/details/7050811MongoDB基本使用成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。输入help可以看到基本操作命令:show dbs:显示数据库列表 show collections:显示当前数据库中的集合(类似关系数据库中的表) show users:显示用户 use :切换当前数据库,这和MS-SQL里面的意思一样 db.help():显示数据库操作命令,里面有很多的命令 db.foo.help():显示集合操作命令,同样有很多的命令,
阅读全文
摘要:#include #include #include #include #include #include using namespace std;using namespace boost::property_tree; int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); string s = "{/"age/" : 26,/"study/":{/"language/":{/"one/":/"chinese/&qu
阅读全文
摘要:语法: const char *c_str();搜索c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样: char* c; string s="1234"; c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理应该这样用: char c[20]; string s=&
阅读全文
摘要:MongoDB之bson的介绍1. 什么是bsonBSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的Protocol Buffer,但是BSON是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,BSON有三个特点:轻量性、可遍历性、高效性{“hello":"world"} 这是一个BSON的例子,其中
阅读全文
摘要:C++ 异常使用 try、catch 和 throw 关键字。引发表达式指示错误或异常情况。 可以将任何类型的对象用作引发表达式的操作数。 此对象通常用于传达有关错误的信息。 通常,应使用在标准库中定义的 std::exception 类或某个派生类,或者,如果这些都不适用,则从 std::exception 派生自己的异常类。try 块封装一个或多个可能引发异常的语句。一个或多个 catch 块紧跟在 try 块之后。 每个 catch 块指定它能处理异常的类型。以下语法显示一个示例 try 块及其处理程序。 假设 GetNetworkResource() 通过网络连接获取数据,并且两个异常
阅读全文
摘要:驱动和客户端库https://mongodb-documentation.readthedocs.org/en/latest/ecosystem/drivers.html#id2https://mongodb-documentation.readthedocs.org/en/latest/ecosystem/drivers/cpp-to-sql-to-mongo-shell.html论坛日志下载驱动活动翻译窗体顶端窗体底端编辑GitHub报告问题SQL tomongoShell to C++MongoDB queries are expressed as JSON (BSON) objects
阅读全文
摘要:对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新。更新修改器是中特殊的键,用来指定复杂的操作,比如增加、删除或者调整键,还可能是操作数组或者内嵌文档。1.$inc--------------------------------------------------------------------------这个修改器干什么使的呢?看看下面示例的具体操作后的结果即可知道。示例文档:{"uid":"201203","type":"1",size:10}> d
阅读全文
摘要:1、虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如 c1.A::display( )。在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的。C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员。现在,将类A声明为虚基类,方法如下:class A//声明基类A{…};class B :virtual public...
阅读全文
摘要:每次遇到vs配置都要让我头疼一段时间,对于某些不太清楚,有时自己试着配置,能运行起来就行,下次又忘了咋陪的了,其中配置的东西真心多。1.输出目录这样配置../../Bin/Server/这个路径是相对于vcproj文件的路径,也就是项目文件的路径2.无法启动程序 E:\.dll配置属性中调试中 "命...
阅读全文
摘要:本文导读:Mongodb是一种强大,灵活,可扩展的数据存储方式。它扩展了关系型数据库众多有用的功能,如索引,范围查询和排序。 MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型.与数据库打交道的那些应用。例如,JSON没有日期类型,这会使得处理本来简单的日期问题变得非常繁琐。只有一种数字类型,没法区分浮点数和整数,更不能区分32位和64位数字。也没有办法表示其他常用类型,如正则表达式或函数。 下面是MongoDB的支持的数据类型: 1、 null: null用于表示空值或者不存在的字段。 {"x...
阅读全文
摘要:1>LINK : fatal error LNK1104: 无法打开文件“..\..\..\Bin\Server\DBCenter.dll”原来是别的程序在使用这个文件,害得我查了半天。
阅读全文
摘要:1 动态语言和静态语言 通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。 1 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。 2 静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C...
阅读全文
摘要:Defined in headertemplateclassshared_ptr;(since C++11)std::shared_ptris a smart pointer that retains shared ownership of an object through a pointer. Severalshared_ptrobjects may own the same object; the object is destroyed when the last remainingshared_ptrpointing to it is destroyed or reset. The o
阅读全文
摘要:auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。std::auto_ptr pa(new ClassA);下面主要分析一下auto_ptr的几个要注意的地方:1,Transfer of Ownershipauto_ptr与boost库中的share_ptr不同的,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有,在给其他auto_ptr赋值的时候,会转移这种拥有
阅读全文
摘要:Utilities 由短小精干的类和函数构成,执行最一般性的工作。 这些工具包括: general types 一些重要的C函数 numeric limitsPairs C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 classpair可以将两个值视为一个单元。容器类别map和multimap就是使用pairs来管理其健值/实值(key/value)的成对元素。 pair被定义为struct,因此可直接存取pair中的个别值.两个pairs互相比较时, 第一个元素正具有较高的优先级. 例: namespace std{ template bool operator..
阅读全文
摘要:调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议。这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。 在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号名,以便允许同一个名字(具有不同的参数类型或者是不同的作用域)有多个用法,而不会打破现有的基于C的链接器。这项技术通常被称为名称改编(Name Mangling)或者名称修饰(Name Decoration)。许多C++编译器厂商选择了自己的名称修饰方案。 因此,为了使其它语言编写的模块(如
阅读全文
摘要:示例代码如下:#include int asdf(int a){ printf("%d\n",a); return 0;}int main(){ int (*p)(int); asdf(5); p=asdf; (*p)(5); p(5); printf("asdf is %d,p is %d,*p is %d\n",asdf,p,*p); return 0; }问题,为什么asdf(5),(*p)(5),p(5)三种调用都正确且都能输出正确结果?解答:首先需要明确的一点:函数名不是指针,数组名也不是指针。函数名只是在编程时候代指函数入口地址的符号,函数入
阅读全文
摘要:“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用
阅读全文
摘要:bind - boost头文件: boost/bind.hppbind 是一组重载的函数模板.用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象.它的源文件太长了. 看不下去. 这里只记下它的用法:9.1 对于普通函数假如有函数 fun() 如下: void fun(int x, int y) { cout (f, 3)(); //指出返回值的类型 void 9.2 对于非静态成员函数假如有: struct A { void func(int x, int y) { cout ptr_a(pa); //智能指针. 现在要向像 A::func 这样的非静态...
阅读全文
摘要:map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。 map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。 使用map容器需要头文件包含语句“#include”, map文件也包含了对multimap多重映照容器的定义。 1、map创建、元素插入和遍历访问 创建map对象,键值与映照数据的类型由自己定义。在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,下面这个程序详细说明了如何操作ma...
阅读全文
摘要:IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。 调用的步骤如下: 抽象出一个完成端口大概的处理流程: 1:创建一个完成端口。 2:创建一个线程A。 3:A线程循环调用GetQueuedCompletionStatus
阅读全文
摘要:很久没有遇到像never grow old这样歌曲,这首歌是高中时,英语报纸后面的一首歌,挺第一次就感觉这个不错,大一大二是我发现好歌的黄金期,每次到学校的网吧下个几百首,然后捡好听的听,和室友讨论歌曲和乐队,如小红莓,yellow等,朋友的步步高手机里面的歌,我当时听怎么感觉很奇怪,但听着听着感觉不错。现在怎么发现这些乐队突然都消失了,现在听的都是一些流行的歌曲。Taylor Swift,katy perry歌可以说也是流行歌,时间长了没啥意思。还有微博自从上次整治之后感觉百无聊赖了,有点死沉的感觉。你看热门微博不是搞笑的就是娱乐大明星,感觉微博真不如以前了。
阅读全文
摘要:对sunway程序中的BUG所进行的修改需要注意的是Sunway上面文章“深入A*算法”中引用了一个A*的游戏程序进行讲解,并有这个源码的下载,不过它有一个不小的Bug, 就是新的子节点放入OPEN表中进行了排序,而当子节点在Open表和Closed表中时,重新计算估价值后,没有重新的对Open表中的节点排序,这个问题会导致计算有时得不到最优解,另外在路网权重悬殊很大时,搜索范围不但超过Dijkstra,甚至搜索全部路网, 使效率大大降低。 Drew 对这个问题进行了如下修正,当子节点在Open表和Closed表中时,重新计算估价值后,删除OPEN表中的老的节点,将有新估价值的节点插入OPE.
阅读全文
摘要:一、前言 在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子。值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇《初识A*算法》。 这里所举的例子是参考AMIT主页中的一个源程序,使用这个源程序时,应该遵守一定的公约。二、A*算法的程序编写原理 我在《初识A*算法》中说过,A*算法是最好优先算法的一种。只是有一些约束条件而已。我们先来看看最好优先算法是如何编写的吧。 如图有如下的状态空间:(起始位置是A,目标位置是P,字母后的数字表示节点的估价值) 搜索过程中设置两个表:OPEN和CLOSED。OPEN表保存...
阅读全文
摘要:写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里抛砖引玉,希望大家都来热心的参与。 还是说正题,我先拿A*算法开刀,是因为A*在游戏中有它很典型的用法,是人工智能在游戏中的代表。 A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚A*算法,我看还是先说说何谓启发式算法。一、何谓启发式搜索算法 在说它之前先提提状态空间搜索。状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有...
阅读全文
摘要:1 基础主题:秒表 下面我们要为一个机械秒表建模一个状态机。这样一个秒表通常会有两个按钮。 * Start/Stop * Reset 同时有两种状态: * Stoped: 表针停留在上次停止时的位置: o 按下Reset按钮,表针回退到0的位置。秒表保持在Stoped状态不变。 o 按下Start/Stop按钮,秒表转到Running状态。 * Running: 表针在移动,并持续显示过去的时间: o 按下Reset按钮,表针回退到0的位置,秒表转到停止状态。 o 按下Start/Stop按钮...
阅读全文
摘要:Template模板方法模式作用:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。其关键是将通用算法(逻辑)封装在抽象基类中,并将不同的算法细节放到子类中实现。UML图如下:AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶层逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到之类实现。顶层逻辑也有可能调用一些具体方法。ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有任意多个Co
阅读全文
摘要:Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。 OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与..
阅读全文