飯中淹的避難所~~~~~
偶爾來避難的地方~
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 © 飯中淹
中文字幕久久波多野结衣av
|
无码人妻久久一区二区三区免费丨
|
99精品久久精品一区二区
|
精品无码久久久久久尤物
|
久久av高潮av无码av喷吹
|
模特私拍国产精品久久
|
久久国产精品99国产精
|
久久婷婷人人澡人人
|
日本亚洲色大成网站WWW久久
|
丰满少妇人妻久久久久久
|
久久精品中文字幕一区
|
久久精品国产精品亚洲毛片
|
嫩草伊人久久精品少妇AV
|
国产免费久久久久久无码
|
国产精品一区二区久久不卡
|
国内精品伊人久久久久AV影院
|
久久艹国产
|
日韩欧美亚洲综合久久影院d3
|
无码人妻久久一区二区三区免费丨
|
国产免费久久精品丫丫
|
亚洲国产精品久久久久婷婷老年
|
久久99久久99精品免视看动漫
|
久久中文字幕视频、最近更新
|
久久精品午夜一区二区福利
|
伊色综合久久之综合久久
|
丁香五月综合久久激情
|
国产午夜福利精品久久2021
|
久久久久亚洲精品天堂
|
久久久久久久波多野结衣高潮
|
思思久久99热免费精品6
|
久久综合丁香激情久久
|
国产精品久久国产精品99盘
|
久久久久亚洲av无码专区导航
|
丁香色欲久久久久久综合网
|
综合久久给合久久狠狠狠97色
|
久久精品国产亚洲AV不卡
|
99久久国产综合精品五月天喷水
|
精品国际久久久久999波多野
|
久久久噜噜噜久久熟女AA片
|
亚洲国产精品无码久久98
|
麻豆AV一区二区三区久久
|