飯中淹的避難所~~~~~
偶爾來避難的地方~
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks
<
2025年5月
>
日
一
二
三
四
五
六
27
28
29
30
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
31
1
2
3
4
5
6
7
公告
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(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.?一種經典的網絡游戲服務器架構(31488)
2.?使用IOCP需要注意的一些問題~~(不斷補充)(11421)
3.?【備忘】Android ndk下用AssetManager讀取assets的資源。(10368)
4.?【備忘】Android下編譯cocos2dx工程(4713)
5.?WOF(名將三國)的TGL文件格式(4693)
評論排行榜
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
飯中淹
閱讀(1258)
評論(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
|
久久亚洲中文字幕精品有坂深雪
|
亚洲AV无码1区2区久久
|
午夜精品久久久久久影视777
|
久久久99精品成人片中文字幕
|
合区精品久久久中文字幕一区
|
久久久噜噜噜久久中文字幕色伊伊
|
久久精品国产亚洲沈樵
|
久久久99精品成人片中文字幕
|
日本人妻丰满熟妇久久久久久
|
91精品婷婷国产综合久久
|
亚洲精品乱码久久久久久蜜桃
|
久久亚洲色一区二区三区
|
97精品依人久久久大香线蕉97
|
久久香蕉综合色一综合色88
|
国产精品亚洲综合久久
|
国产精品岛国久久久久
|
久久天天躁狠狠躁夜夜avapp
|
99久久人妻无码精品系列蜜桃
|
中文国产成人精品久久亚洲精品AⅤ无码精品
|
999久久久无码国产精品
|
狠狠综合久久综合中文88
|
久久99国产综合精品免费
|
欧美亚洲日本久久精品
|
久久精品国产精品国产精品污
|
综合人妻久久一区二区精品
|
精品欧美一区二区三区久久久
|
国产V亚洲V天堂无码久久久
|
精品人妻伦九区久久AAA片69
|
合区精品久久久中文字幕一区
|
a级毛片无码兔费真人久久
|
无码久久精品国产亚洲Av影片
|
国产L精品国产亚洲区久久
|
国产精品久久久久久
|
蜜桃麻豆WWW久久囤产精品
|
亚洲人成网站999久久久综合
|
久久亚洲高清综合
|
久久午夜福利电影
|
无码8090精品久久一区
|