2010-02-02 72 views
0

我知道该怎么做一个不透明物体在C++如下:不透明物体

// my_class.hpp 
class opaque_object; 
class my_class { 
    my_class(); 
    ~my_class(); 
    opaque_object *m_opaque_object; 
}; 

// my_class.cpp 
#include <my_class.hpp> 
class opaque_object { 
    // ... 
}; 
my_class::my_class() { m_opaque_object = new opaque_object(); } 
my_class::~my_class() {delete m_opaque_object; } 

现在该怎么做时,不透明的对象是不同的命名空间现有的模板类,而不包括这一个的头文件。下面的代码不好,它只是在这里来说明我的问题。

// my_class.hpp 
class third::party::library::opaque_object< 
    third::party::library::templated_class>; 

class my_class { 
    my_class(); 
    ~my_class(); 
    third::party::library::opaque_object< 
     third::party::library::templated_class> *m_opaque_object; 
}; 

// my_class.cpp 
#include <my_class.hpp> 
#include <third/party/library/opaque_object.hpp> 
#include <third/party/library/template_class.hpp> 

typedef third::party::library::opaque_object< 
    third::party::library::templated_class> opaque_object; 

my_class::my_class() { m_opaque_object = new opaque_object(); } 
my_class::~my_class() {delete m_opaque_object; } 

实际的类的我的源代码,甚至更多的是模板比这个例子(4个参数模板的其中一些其本身的模板类的)。由于my_class.hpp在我的项目中无处不在,所以一般编译需要很长时间(每个cpp文件包含my_class.hpp需要5秒),所以我想避免包含opaque_object.hpp,template_class。 hpp ...在my_class.hpp中。

这怎么办?任何评论,或想法做它都是受欢迎的。 预先感谢您的时间。

+0

有人可能会添加不透明指针到帖子标志(我没有足够的声望来自己做)。先谢谢你! – Phong 2010-02-02 14:59:19

+1

我认为这个标签效果更好,并且它已经存在。对不起,dirkgently :) – GManNickG 2010-02-02 15:03:29

+0

@GMan:从维基百科pimpl成语直接重定向到不透明的指针!但它也被称为“句柄类”,“Pimpl成语”,“编译器防火墙惯用语”或“Cheshire猫”。 (第一次听说我生命中的pimpl习语,谢谢分享) – Phong 2010-02-02 15:08:02

回答

0

需要声明的每个模板类,以及需要为每个模板类(模板参数)与正确的命名空间。

0

为什么不把它的模板,模板参数(不知道你是否需要更多的参数那里:)

template <typename T, template <class> typename opaque> 
class my_class 
{ 
... 
    opaque<T>* opaque_; 
}; 
+0

这是一个相当优雅的方式来做到这一点!但每次我在我的程序中实现这个对象时,如果我没有错,我将需要定义模板参数。 – Phong 2010-02-02 15:19:17