2010-02-02 96 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