博文

C++的多态(2011-09-07 12:45:00)

摘要:当基类中含有虚函数(virtual)时,在运行时刻,通过基类指针(或引用)指向(或引用)具体派生对象时,当调用该指针(或引用)的虚函数时,实际调用的是该具体派生类中定义的相应函数。 那么如果存在以下继承关系: class base; class derived1:public base{...}; class derivedderived1:public derived1{...}; 及derivedderived1继承自derived1,而derived1又继承自base,那么假设base中有一个虚函数 virtual void print(){...}; 在derived1中也定义了该函数只是没有声明为virtual: class derived:public base{ ...... public:     void print(){...} ...... }; 在derivedderived1中也定义了形式上一样的print函数,也没有加virtual说明符;这种情况下,当一个base指针指向derivedderived1的对象,并调用print函数时,会调用哪个类中的print呢? 答案是:derivedderived1中定义的print。这说明了在继承层次中只要从某一层定义时加了virtual的成员函数,其n重派生类中均可实现多态。 现在有另一个问题就是如果derivedderived1中没有定义print这时将调用哪个类的print呢? 答案是:将调用derived1中定义的print函数  ......

阅读全文(2657) | 评论:1

C++笔记(2011-09-02 23:17:00)

摘要:C++知识学习笔记 1. C++中的引用类型变量必须进行初始化,并且这个引用类型变量的值将不能变了,即该变量所代指的对象只能是其初始化时的对象,可见引用变量是十分忠诚的。。 例如:int I = 1;           int& anotherI = I;//正确,编译通过           int& wrongI;//错误,引用变量wrongI必须进行初始化 通常情况下的引用类型变量T&进行初始化时必须为一个”左值“,即通俗的理解为一个T类型的变量名,而不能是T类型的一个常量。但是const T&类型的引用变量进行初始化时就没有这一限制,即其可以用一个常量进行初始化。 例如:  int myT = 5;            int& myTRerfer=myT;//OK, myT is left value            int& myTRefer2=5;//Wrong, 5 is not left value           const int& myTRefer3=5;//OK, const int temp=5 first, myTRefer3=temp then; 2. 什么情况下将引用作为函数参数? 当函数要处理的参数是一个占用内存较大的类对象时,采用引用作为其参数可以避免在进行按值传递机制下对象复制所需内存及时间花销,而直接读取对象的内存,但是一般以const引用作为函数参数,表示函数不会改变对象的内容。如果想要改变对象内容时,应该以指针作为函数的参数,这样就显式的告诉函数使用者本函数将改变对象的内容。        ......

阅读全文(2849) | 评论:1

[转载]wxWidget与VTK结合编程(2011-01-16 15:40:00)

摘要:1.下载安装wxWidget,参见http://wxpack.sourceforge.net/Main/HomePage下载wxPack最新包【Windows下直接安装即可】,其中包含有wxWidgets,wxFormBuilder(可视化GUI设计),wxAdditions(扩展库);
2.下载安装VTK,参见http://www.vtk.org/。下载源码自行编译【需要下载CMake,见http://www.cmake.org】形成库,需提前装有相应的C/C++编译器,如VC或GCC等。注意:为方便操作,设置相应的环境变量。
---------------------------------------------------------------------------------------------------------------------------------------------------
CMake的用法十分简便:运行CMake后,定位到VTK的源码处【解压源码后的文件夹】;同时指定生成的项目文件的目录;点击Configure按钮,出现若干选项,根据需要进行设置,如多线程,JAVA库等;选择相应的编译器【决定所生成的库所适用的范围和平台,如VS下生成的库不能移植到GCC下;反之亦然。但不影响源码的可移植性。】相应设置完成后,点击OK按钮,进入项目文件的生成。。。。。进入到生成的项目文件的目录打开相应的项目文件,如VS7.1等,选择生成ALL_BUILD,就可以喝杯咖啡去了【雪顶摩卡貌似还可】。。。。。。。。~~~~~~~~~~········,生成结束后,找到INSTALL项目,右键BUILD生成即可自动将生成的VTK库《静态和动态》以及相应的include包含文件自动拷贝到安装目录【默认下为C:\Program files\VTK】。此时就可以进行VTK程序应用开发了。---------------------------------------------------------------------------------------------------------------------------------------------------
3. 下载wxVT......

阅读全文(5000) | 评论:0

[转载]wxVTK编译时的错误(2011-01-16 15:39:00)

摘要:Wx\wxVTK\src\wxVTKRenderWindowInteractor.cxx(86): error C2491: “wxVTKRenderWindowInteractor::ms_classInfo” : 不允许 dllimport 静态数据成员 的定义

解决办法:根据wxVTK提供的readme提示,出现的原因在于vtk和wxWidget混合使用了静态链接和动态链接,解决方案如下

                     VTK static静态     VTK dynamic动态
wxWindows static静态        1                3
wxWindows dynamic动态       2                4

Just open the file: wxVTKRenderWindowInteractor.h, find the line:
打开文件: wxVTKRenderWindowInteractor.h, 找到下面的语句
class VTK_RENDERING_EXPORT wxVTKRenderWindowInteractor : public wxWindow, public vtkRenderWindowInteractor
      ^^^^^^^^^^......

阅读全文(3350) | 评论:0

组合,关联,聚合的区别(2009-07-01 09:05:00)

摘要:类间关系 在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。 (1)继承:指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类。例如,图3.2给出了MFC中 CObject类和菜单类CMenu的继承关系。
     图3.2 类的继承 类的继承在C++中呈现为: class B { }
 class A : public B{ } (2)关联:指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。
 
 关联在C++中呈现为: class A{...}
 class B{ ...}
 A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b) 即一个类作为另一个类方法的参数。 (3)聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。 (4)组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。 聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较......

阅读全文(4332) | 评论:0

[转]undefined reference to vtable(2009-03-18 20:56:00)

摘要:最近在写一套基础类库用于SG解包blob字段统计,在写完了所有程序编译时遇到一个郁闷无比的错误:
MailBox.o(.text+0x124): In function `CMailBox::CMailBox[not-in-charge](CMmogAnalyseStatManager*)':
../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.text+0x182): In function `CMailBox::CMailBox[in-charge](CMmogAnalyseStatManager*)':
../src/MailBox.cpp:27: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x33): In function `CMailBox::~CMailBox [in-charge]()':
../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD1Ev+0x4f):../include/MailBox.hpp:22: undefined reference to `CSgAnalyseStatBase::~CSgAnalyseStatBase [not-in-charge]()'
MailBox.o(.gnu.linkonce.t._ZN8CMailBoxD0Ev+0x33): In function `CMailBox::~CMailBox [in-charge deleting]()':
../include/MailBox.hpp:22: undefi......

阅读全文(5243) | 评论:0

[c、c++]宏中"#"和"##"的用法(2009-02-01 09:41:00)

摘要:宏中"#"和"##"的用法
一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b) int main()
{
    printf(STR(vck));           // 输出字符串"vck"
    printf("%d\n", CONS(2,3));  // 2e3 输出:2000
    return 0;
}
二、当宏参数是另一个宏的时候
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1, 非'#'和'##'的情况
#define TOW      (2)
#define MUL(a,b) (a*b) printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW));
这行的宏会被展开为:
printf("%d*%d=%d\n", (2), (2), ((2)*(2)));
MUL里的参数TOW会被展开为(2).
2, 当有'#'或'##'的时候
#define A          (2)
#define STR(s)     #s
#define CONS(a,b)  int(a##e##b) printf("int max: %s\n",  STR(INT_MAX));    // INT_MAX ......

阅读全文(2400) | 评论:1

在论坛里回复别人关于链表操作的帖子(2008-11-29 13:15:00)

摘要:#include<iostream> using namespace std;   struct Node {     double content;     Node*  next;     Node():content(0.0),next(NULL){}//默认构造函数     Node(double c,Node* n):content(c),next(n){}//又一构造函数 };   void clearList(Node* h)//链表内存回收 {      if(h)      {          if(h ->next)          {              Node* nextHead= h ->next;              delete h;              clearList(nextHead);          }          else          {         &n......

阅读全文(2399) | 评论:0

模板类的友元模板函数(2008-11-04 20:46:00)

摘要:摘自:http://www.informit.com/ 一下内容说明了定义友元时需注意的规则及模板类中友元模板函数的特殊语法结构: friend Declarations PartI Last updated Aug 19, 2005. friend declarations have a few unintuitive properties that might confuse both beginners and experienced programmers. Some of the declarations use special syntactic forms, while others have an unusual semantics. Read all about friend declarations here. The Essence of Friendship A class may declare a function or another class as its friend. A friend has access to all the class' members, including private and protected ones. The name of a friend is not in the scope of the class. Here are two examples of friend declarations:bool operator < (const A&, const A&); class A { private: int x; public: A(); friend bool operator < (const A&, const A&);//friend function friend class B; }; class B { public: void func(int); }; A friend declaration of a function consists of the keyword friend followed by the function's declaration. Thi......

阅读全文(4197) | 评论:0

关于OF中的函数指针(2008-10-29 17:36:00)

摘要:#define declareMemberFunctionSelectionTable\
(returnType,baseType,memberFunction,argNames,argList,parList)                 \
                                                                              \
    /* Construct from argList function pointer type */                        \
    typedef  returnType (*memberFunction##argNames##MemberFunctionPtr)argList; \
&nbs......

阅读全文(3292) | 评论:0