shape.h
#ifndef _shape_h_
#define _shape_h_
class shape;};
class circle:public shape
; class square:public shape
; class rectangle :public shape
;#endif
dynbase.h
#ifndef _dyn_base_h_
#define _dyn_base_h_
#include #include #include using namespace std;
typedef void* (*create_func)();//定義函式指標
class dynobjectfactory
else
}static void register(const string& name,create_func func)
private:
static mapmapcls_;//建立的方法儲存在map 容器當中了。
};_declspec(selectany) mapdynobjectfactory::mapcls_;
class register
};//巨集的定義
#define register_class(class_name)\
class class_name##register\
private:\
static register reg_;\
};\ register class_name##register::reg_(#class_name,class_name##register::newinstance);
#endif
cpp main
//動態建立物件 對原有的類不做任何改變,只需要增加乙個巨集就能夠實現動態建立
#include "shape.h"
#include #include #include #include "dynbase.h"
using namespace std;
void drawallshape(const vector& v)
} void deleteallshape(const vector& v) }
int main(void)
shape.cpp
#include "shape.h"
#include #include "dynbase.h"
using namespace std;
void circle:: draw()
{ cout<<"circle::draw.."<
部分語言摘抄:
也即定義了乙個新類,且由於含有static 成員,則在main函式執行前先執行初始化,呼叫register類建構函式,在建構函式中呼叫
dynobjectfactory::register(name, func); 即呼叫dynobjectfactory 類的靜態成員函式,在register函式中通過map容器完成了
字串與函式指標配對的註冊,如mapcls_[name] = func;
進入main函式,呼叫dynobjectfactory::createobject("circle") ,createobject函式中通過string找到對應的函式指標
(newinstance),並且呼叫後返回建立的物件指標,需要注意的是 return it->second(); 中it->second 是函式指標,後面加括
號表示呼叫這個函式。對巨集定義中的#,##用法不熟悉的可以參考這裡。
這樣當需要建立多個不同類物件的時候,就不再需要寫很多ifelse的判斷了。
C 入門(7) 物件
類 屬性 方法 類名的第乙個字母一般採用大寫,類宣告的末尾必須加上分號 c 允許在類裡宣告常量,但不允許對它賦值,除非建立乙個靜態常量。構造器 1 構造器的名字和它所在類的名字一樣 2 系統會在建立出某個新例項之後,立刻自動呼叫這個類的構造器 3 構造器永遠不返回任何值。如果沒有在類裡定義乙個構造器...
3 5物件陣列 C
1.簡介 物件陣列和普通陣列沒有本質的區別,只不過普通陣列的元素是簡單變數,而物件陣列的元素是物件而已。物件陣列在實際中的主要應用在系統需要乙個類的多個物件的情況。例如需要建立100學生檔案,每個檔案包括姓名,性別,年齡等內容。例如下面 student students 宣告了100個學生陣列,系統...
9 物件建立過程和多型
5.多型 重重之重 難點 4.物件建立的過程 了解 4.1單個物件建立的過程 成員變數 新的值 由結果可知優先順序如下 初始化方式 構造塊 構造方法 由結果可知優先順序如下 靜態 塊 構造塊 構造方法 4.2子類物件建立的過程 1 main 方法時程式的入口,當建立物件時會在堆區申請一塊儲存區域 2...