飯中淹的避難所~~~~~
偶爾來避難的地方~
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks
<
2009年6月
>
日
一
二
三
四
五
六
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
6
7
8
9
10
11
公告
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(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的資源。(10401)
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 © 飯中淹
久久精品夜色噜噜亚洲A∨
|
蜜桃麻豆www久久国产精品
|
国产产无码乱码精品久久鸭
|
蜜桃麻豆www久久
|
久久亚洲中文字幕精品一区
|
91精品国产91久久综合
|
久久伊人色
|
91精品国产综合久久婷婷
|
欧美麻豆久久久久久中文
|
久久久久久亚洲AV无码专区
|
色青青草原桃花久久综合
|
2021国产成人精品久久
|
国产亚洲精品美女久久久
|
精品国产日韩久久亚洲
|
久久精品?ⅴ无码中文字幕
|
国产亚洲欧美精品久久久
|
久久天天躁狠狠躁夜夜不卡
|
久久天天日天天操综合伊人av
|
国产欧美一区二区久久
|
国产偷久久久精品专区
|
久久久久亚洲Av无码专
|
伊人色综合久久天天人守人婷
|
久久亚洲欧洲国产综合
|
国产欧美久久一区二区
|
2020久久精品国产免费
|
91久久婷婷国产综合精品青草
|
日韩精品久久无码人妻中文字幕
|
国内精品久久久久影院亚洲
|
日日狠狠久久偷偷色综合0
|
国产精品热久久无码av
|
国产一区二区精品久久岳
|
999久久久国产精品
|
久久99精品久久久久久野外
|
久久精品亚洲中文字幕无码麻豆
|
亚洲av日韩精品久久久久久a
|
久久只这里是精品66
|
久久婷婷五月综合成人D啪
|
久久强奷乱码老熟女网站
|
99久久国产精品免费一区二区
|
久久精品国产久精国产一老狼
|
国内精品久久久久影院薰衣草
|