飯中淹的避難所~~~~~
偶爾來避難的地方~
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks
<
2007年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
公告
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(19)
給我留言
查看公開留言
查看私人留言
隨筆分類
XLIBPLUS(1)
(rss)
手機開發(ios)(2)
(rss)
數據算法分析(19)
(rss)
游戲策劃(1)
(rss)
游戲服務器(17)
(rss)
游戲客戶端(9)
(rss)
隨筆檔案
2017年11月 (1)
2013年10月 (1)
2012年12月 (4)
2012年11月 (1)
2012年2月 (2)
2011年10月 (1)
2011年9月 (1)
2011年8月 (3)
2011年7月 (6)
2011年6月 (1)
2011年5月 (2)
2011年4月 (7)
2011年3月 (1)
2011年2月 (5)
2011年1月 (2)
2010年8月 (4)
2010年7月 (1)
2010年5月 (5)
2010年4月 (3)
2010年3月 (3)
2010年2月 (3)
2010年1月 (5)
2009年12月 (1)
2009年11月 (1)
2009年9月 (1)
2009年7月 (1)
2009年6月 (1)
2009年3月 (2)
2009年2月 (1)
2009年1月 (3)
2008年6月 (2)
2008年4月 (10)
2007年5月 (1)
2007年4月 (7)
2007年3月 (1)
新聞檔案
2007年5月 (1)
相冊
aaa
我的其他BLOG
搜索
最新評論
1.?re: 【備忘】Android ndk下用AssetManager讀取assets的資源。
能給個完整的嗎
--gy
2.?re: 【未解決的問題(們)】[未登錄]
我們的解決辦法是,代碼里用英文注釋。
--Alex
3.?re: 一種經典的網絡游戲服務器架構
學習了 make一下
--mikie
4.?re: 【備忘】用ndk編譯freetype
為什么 我執行 ./configure 時 出現 Nothing to be done for `unix'.
--boom
5.?re: 【備忘】Android ndk下用AssetManager讀取assets的資源。
謝謝,幫了大忙!!!
--過客
閱讀排行榜
1.?一種經典的網絡游戲服務器架構(31557)
2.?使用IOCP需要注意的一些問題~~(不斷補充)(11454)
3.?【備忘】Android ndk下用AssetManager讀取assets的資源。(10402)
4.?【備忘】Android下編譯cocos2dx工程(4734)
5.?WOF(名將三國)的TGL文件格式(4732)
評論排行榜
1.?一種經典的網絡游戲服務器架構(35)
2.?WOF(名將三國)的TGL文件格式(19)
3.?使用IOCP需要注意的一些問題~~(不斷補充)(16)
4.?通用的類成員函數調用方法.(12)
5.?無鎖線程通信(1)(11)
搭建通用構造器
1- 我們來確定我們的目標
我們需要事先一個叫做xCreator的模板類,能夠根據一個基類TBase實例化出一個構造器類,能夠通過Support<TObject>()的形式來支持TBase的派生類TObject,并能夠通過 Create<TObject>() 的形式來構造出這個TObject的對象。
2- 思考我們事先這個目標的理論基礎
我們需要為每個TObject,創建一個單獨的內部構造器,在Support調用的時候,創建并存儲這個內部構造器。當Create調用的時候,我們尋找這個內部構造器,并且通過這個構造器構造出TObject的對象。
3- 內部構造器
在設計內部構造器的時候,因為需要一個通用的返回TBase的接口,所以,我們把這個接口做成一個虛接口。
class
xBaseCreator
{
public
:
virtual TBase
*
CreateObject()
=
0
;
}
;
接下來,就是用模板來實現TObject的構造器了。
template
<
class
TObject
>
class
xObjectCreator :
public
xBaseCreator
{
public
:
TBase
*
CreateObject()
{
return
new
TObject();}
}
;
有了內部的構造器,我們構造出外部的框架xCreator
template
<
class
TBase
>
class
xCreator
{
class
xBaseCreator
{
public
:
virtual TBase
*
NewObject()
=
0
;
}
;
template
<
class
TObject
>
class
xObjectCreator :
public
xBaseCreator
{
public
:
TBase
*
CreateObject()
{
return
new
TObject();}
}
;
public
:
template
<
class
TObject
>
void
Support()
{
}
template
<
class
TObject
>
TBase
*
Create()
{
}
}
;
現在,這個構造器已經有了雛形。
4- 實現Support
Support說白了,就是通過TObject來創建一個內部構造器,并保存在xCreator<TBase>里面。
那么我們需要在這個框架里加入一個容器來存儲一系列的內部構造器。
xVector
<
xBaseCreator
*>
m_vInnerCreators;
這里用的xVector是xlibplus的一部分,實際上它表現的跟STL的vector很相似,可以互換使用。
下面就是Support的實際代碼,很簡單的一句(沒有做一些安全性和重復的檢測)
template
<
class
TObject
>
void
Support()
{
m_vInnerCreators.push_back(
new
xObjectCreator
<
TObject
>
() );
}
5- 實現Create
Create是整個構造器的重頭戲。我們需要找到一種方法,能夠通過TObject來找到它所對應的內部構造器。
我們知道,同一個類中的靜態成員的地址對于所有類成員來說,是一個相同的固定的地址。這樣,這個地址,就可以標示一個特定的類。
然后,我們知道,模板參數相同的模板類實例類,是同一個類。
根據這兩個,我們能夠設計一種方法,通過靜態成員的地址,來找到TObject對應的內部構造器的方法。下面就是這種方法的代碼。
首先,修改xBaseCreator的接口,提供一個獲取類的Code的接口,這個Code就是模板類中的一個靜態變量的地址。
class
xBaseCreator
{
public
:
virtual TBase
*
CreateObject()
=
0
;
virtual
void
*
GetClassCode()
=
0
;
}
;
然后,修改xObjectCreator,提供一個靜態變量,以及GetClassCode()的實現。
template
<
class
TObject
>
class
xObjectCreator :
public
xBaseCreator
{
public
:
static
void
*
GetCode()
{
static
int
nClassCode
=
0
;
return
&
nClassCode;
}
void
*
GetClassCode()
{
return
GetCode();}
TBase
*
CreateObject()
{
return
new
TObject();}
}
;
最后,我們把Create寫好。
template
<
class
TObject
>
TBase
*
Create()
{
void
*
pClassCode
=
xObjectCreator
<
TObject
>
::GetCode();
for
(
int
i
=
0
;i
<
m_vInnerCreators.size();i
++
)
if
( m_vInnerCreators[i]
->
GetClassCode()
==
pClassCode )
return
m_vInnerCreators[i]
->
CreateObject();
return
NULL;
}
從代碼中可以看出整個方法都集中在這個Create里面的內部構造器搜索上面。這種方法有點類似RTTI。
到現在為止,這個通用構造器就基本完成了。代碼比較糙,只是用來說明這個方法。至于刪除之類的代碼,就比較簡單了.
下面是完整的這個構造器的代碼,以及測試代碼。
#include
"
stdafx.h
"
#include
<
conio.h
>
template
<
class
TBase
>
class
xCreator
{
class
xBaseCreator
{
public
:
virtual TBase
*
CreateObject()
=
0
;
virtual
void
*
GetClassCode()
=
0
;
}
;
template
<
class
TObject
>
class
xObjectCreator :
public
xBaseCreator
{
public
:
static
void
*
GetCode()
{
static
int
nClassCode
=
0
;
return
&
nClassCode;
}
void
*
GetClassCode()
{
return
GetCode();}
TBase
*
CreateObject()
{
return
new
TObject();}
}
;
xVector
<
xBaseCreator
*>
m_vInnerCreators;
public
:
template
<
class
TObject
>
void
Support()
{
m_vInnerCreators.push_back(
new
xObjectCreator
<
TObject
>
() );
}
template
<
class
TObject
>
TBase
*
Create()
{
void
*
pClassCode
=
xObjectCreator
<
TObject
>
::GetCode();
for
(
int
i
=
0
;i
<
m_vInnerCreators.size();i
++
)
if
( m_vInnerCreators[i]
->
GetClassCode()
==
pClassCode )
return
m_vInnerCreators[i]
->
CreateObject();
return
NULL;
}
}
;
class
CBase
{
public
:
virtual
int
GetCode()
const
{
return
0
;}
}
;
class
CTest1 :
public
CBase
{
public
:
virtual
int
GetCode()
const
{
return
1
;}
}
;
class
CTest2 :
public
CBase
{
public
:
virtual
int
GetCode()
const
{
return
2
;}
}
;
xCreator
<
CBase
>
testcreator;
int
_tmain(
int
argc, _TCHAR
*
argv[])
{
testcreator.Support
<
CTest1
>
();
testcreator.Support
<
CTest2
>
();
CBase
*
p1
=
testcreator.Create
<
CTest1
>
();
CBase
*
p2
=
testcreator.Create
<
CTest2
>
();
printf(
"
code = %u / %u\n
"
, p1
->
GetCode(), p2
->
GetCode() );
getch();
return
0
;
}
posted on 2008-04-01 02:22
飯中淹
閱讀(1263)
評論(6)
編輯
收藏
引用
評論
#
re: 搭建通用構造器
2008-04-01 09:05
夢在天涯
有新意!
回復
更多評論
#
re: 搭建通用構造器
2008-04-01 09:48
raof01
不錯。不過我認為xObjectCreator不需要繼承xBaseCreator——已經通過模板來得到一定的多態性了。
回復
更多評論
#
re: 搭建通用構造器
2008-04-01 09:53
飯中淹
@raof01
我為了實現無差別的遍歷, 所以讓他繼承.
回復
更多評論
#
re: 搭建通用構造器
2008-04-01 10:06
mm
哎,直接用map不就得了,還用vector
回復
更多評論
#
re: 搭建通用構造器
2008-04-01 10:14
飯中淹
@mm
用map和vector根這個方法無關。用vector比較好理解這個查找過程。
回復
更多評論
#
re: 搭建通用構造器
2008-04-03 12:46
w11
師傅,您好,哈哈,
想不到又碰見我吧
回復
更多評論
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 飯中淹
亚洲精品无码久久不卡
|
蜜臀av性久久久久蜜臀aⅴ
|
久久久久婷婷
|
久久亚洲美女精品国产精品
|
99久久精品费精品国产一区二区
|
91性高湖久久久久
|
国内精品久久久久影院薰衣草
|
粉嫩小泬无遮挡久久久久久
|
久久国产V一级毛多内射
|
亚洲国产精品无码成人片久久
|
狠狠色丁香婷婷久久综合不卡
|
色综合久久精品中文字幕首页
|
亚洲精品国精品久久99热
|
青草影院天堂男人久久
|
伊人久久精品无码av一区
|
99久久99久久精品国产
|
精品无码久久久久国产
|
中文字幕无码免费久久
|
99久久www免费人成精品
|
国产午夜精品理论片久久影视
|
久久精品国产99国产精偷
|
怡红院日本一道日本久久
|
久久综合给合久久狠狠狠97色
|
亚洲精品综合久久
|
久久精品亚洲欧美日韩久久
|
青草影院天堂男人久久
|
久久综合欧美成人
|
99国产欧美久久久精品蜜芽
|
国内精品综合久久久40p
|
久久SE精品一区二区
|
亚洲AV无码久久精品色欲
|
久久精品国产2020
|
人人妻久久人人澡人人爽人人精品
|
欧美久久久久久午夜精品
|
国产精品无码久久久久
|
国产精品激情综合久久
|
久久国产精品免费
|
色播久久人人爽人人爽人人片aV
|
久久久中文字幕日本
|
中文精品久久久久人妻
|
久久亚洲精精品中文字幕
|