飯中淹的避難所~~~~~
偶爾來避難的地方~
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.?一種經典的網絡游戲服務器架構(31508)
2.?使用IOCP需要注意的一些問題~~(不斷補充)(11436)
3.?【備忘】Android ndk下用AssetManager讀取assets的資源。(10389)
4.?【備忘】Android下編譯cocos2dx工程(4722)
5.?WOF(名將三國)的TGL文件格式(4712)
評論排行榜
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
飯中淹
閱讀(1261)
評論(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
|
亚洲人成伊人成综合网久久久
|
99热都是精品久久久久久
|
国产福利电影一区二区三区久久老子无码午夜伦不
|
人妻无码中文久久久久专区
|
国产精品久久久久久一区二区三区
|
国产精品一久久香蕉国产线看观看
|
精品久久久久久99人妻
|
久久久久久久久久久久中文字幕
|
少妇人妻综合久久中文字幕
|
精品久久久久久无码专区
|
综合久久一区二区三区
|
久久九九亚洲精品
|
伊人久久大香线蕉综合Av
|
久久强奷乱码老熟女网站
|
97久久天天综合色天天综合色hd
|
亚洲欧美精品一区久久中文字幕
|
国产精品亚洲综合专区片高清久久久
|
精品999久久久久久中文字幕
|
色狠狠久久综合网
|
久久精品成人欧美大片
|
久久综合丁香激情久久
|
日韩AV无码久久一区二区
|
久久精品视频91
|
精品久久久久久亚洲
|
久久久一本精品99久久精品88
|
99久久国产综合精品网成人影院
|
国内精品久久久久影院日本
|
亚洲AV无码久久
|
久久香蕉超碰97国产精品
|
综合人妻久久一区二区精品
|
波多野结衣久久一区二区
|
精品久久久久成人码免费动漫
|
99久久精品国产一区二区
|
97久久天天综合色天天综合色hd
|
亚洲国产精品成人久久
|
人妻精品久久无码区
|
久久国产色AV免费看
|
亚洲天堂久久精品
|
久久久久久久久久免免费精品
|
久久人人爽人爽人人爽av
|