c++模板有很多特性需要我們去挖掘,很多新的設計模式也都與模板使用相關,我們知道模板的乙個基本特性就是可以根據傳入的型別產生新的型別。圍繞這個特性,可以衍生出很多的其它特性,比如自動為不同的類生成static變數,為不同的型別生成不同的行為等等。
這篇文章我想討論的是如何在
c++模板中引用傳入類的乙個特定的成員變數。這個特性在我們設計新型類庫的時候,很是有用。我今後想講解的無記憶體管理的資料容器就與這個特性相關。
比如,如果我們想設計乙個通用的hash容器,我們肯定需要提供乙個選擇,讓使用者提供它們自己的hash函式,同時,我們也需要提供乙個預設的hash函式,因為很多時候,我們只需要使用最簡單的hash函式,比如對於整數,我們取模(「%」)。這樣如下的設計浮出水面:
template
classhashcontainer{
按照前面所述,我們需要提供乙個預設的hash函式,而這個函式,我們想讓它以模板引數的形式傳入,所以我們肯定需要實現乙個仿函式:
classintergerhasher{
public:
ulong32 operator()(keytype key){
return ulong32(key%bucketnum);
好的,問題好像來了。假如現在我們有兩個類,它們想使用這個容器。這兩個類的定義如下:
class a{
private:
ulong32 fsid; //hash鍵值
class b{
private:
ulong32 volid; //hash鍵值
它們都只需要預設的hash函式就行,那麼我們的hash模板如何知道它們使用哪個域來作為hash的鍵值呢?
這時,我想到了函式成員指標。也許我們可以利用它。所以定義了如下的模板建構函式:
template
classhashcontainer{
public:
hashcontainer(keytype objtype::*key):mkey(key), mhasher(intergerhasher())
void add(objtype *p);
private:
objtype* objtype::*mkey;
hashfcn mhasher;
這裡視乎還有個問題,如何使用這個成員指標呢?我們以memberfunction add()為例:
template
voidhashcontainer::add(objtype *p)
ulong32 bucket = mhasher(p->*mkey);
我們的模板有了這個技能,就可以如此的使用這個hash容器了:
.hxx
class a{
private:
ulong32 fsid; //hash鍵值
static hashcontainer) manager;
class b{
private:
ulong32 volid; //hash鍵值
static hashercontainer) manager;
.cxx
hashcontainera::manager(&a::fsid);
hashcontainera::manager(&b::volid);
也許你們會問,我們在hashcontainer中可以使用a或b的私有變數嗎?可以嗎?你試試!!!
如何在乙個cpp中呼叫另乙個cpp中的類?
解決方案 新建乙個同名頭檔案,將這個cpp中的類的宣告放在標頭檔案中,在這個cpp以及要呼叫的cpp中include這個標頭檔案即可。在物件導向的程式開發中,一般做法是將類的宣告 其中包含成員函式的宣告 放在指定的標頭檔案中,使用者如果想用該類,只要把有關的標頭檔案包含進來即可,不必在程式中重複書寫...
c 如何在乙個類中定義指向另外乙個類的指標
一 直接定義即可。比如已有乙個類class a,再定義乙個類class b,這樣在b的定義中,就可以有乙個a 型別的成員變數。比如class b 這裡的b a就是乙個a 型別的指標。需要注意的是,要使用這種形式的定義,要麼a的定義在b的上方,要麼在b定義前加乙個a類的宣告。如class a clas...
php 引入類 php如何在乙個類中引入另外乙個類
有時候需要在乙個類中呼叫另外乙個類裡面的方法,然後另外乙個類又需要呼叫當前類的方法,怎麼辦呢?可以直接引入類物件的方式呼叫另外乙個類的方法 示例如下 傳值方式 class a function b obj obj test class b function test echo test a new ...