Zade's Weblog

程序人生

Monthly Archives: 7月 2010

C++的前置声明

我们定义一个完整的接口,并且以插件的方式实现之,这是非常灵活的体系方案.当然对于这个方案,我们的问题也很多,例如我们是否使用智能指针,需要注意哪些问题;我们如何使用前置声明,要注意哪些问题,等等.

我们现在讨论一下C++的前置声明.

std里面关于iosfwd是关于前置声明使用的一个经典的例子.

前置声明有很多的作用,例如解决重复包含问题,智能指针问题等;当然,节省编译时间也是一个很重要的原因.

以我们GIS为例,我们定义了GIS的标准接口GeoAPI,并且定义了geoapifwd.hpp文件.根据前置声明的原理,只要是需要指针的接口定义,并不需要看到类的完整的声明,我们就没有必要包含类的定义文件.

简单的这样说是没有错的,但是实际上着还行不通,有时候我们还必须看到类的定义,这样的情况包括:

1)基类定义,例如class Parent:public Child{};那么Parent必须见到Child的完整定义

2)协变返回值.例如

class Child2{

virtual Child1 *get() const;

};

class Parent2: public Child2{

virtual Parent1* get() const;

};

这里Parent1和Child1是父子关系,在这种情况下,Parent2必须见到Parent1的定义(当然也就见到了Child1的定义),以保证C++编译器确认二者的继承关系.

从这个意义上,我们看到协变返回值是一种和继承关系类似的很强的耦合关系.

小妞妞真的长牙了

今天中午休息的时候,老婆来了电话,神秘的对我说,要告诉我一个好消息.我轻轻的笑着问她是什么好消息,老婆卖关子了好一会才说,我们家的小妞妞长牙了.

在我着急继续询问下,老婆逐渐的告诉我,长了一颗牙,很小,只是露出了一点点,就在下巴正中央的位置.

早在几个月前,小妞妞就有长牙的迹象,但是一直是只打雷不下雨.她总是爱咬东西,爱吃磨牙棒等;但是她的小牙好像和我们捉迷藏似的,总是不露面.

现在好了,终于出来了.而今天是7月9号,距离她11月9号的生日正好是8个月.