C++派生類怎樣進行文件讀寫?

假設我有一個基類Base,派生出類A,B,C。

class Base
{
public:
int type;//Base類為0,A類為1,B類為2,C類為3
virtual void ReadFile(File file);
virtual void WriteFile(File file);
}

類A,B,C派生出了比基類多的成員變數,也重載了ReadFile和WriteFile函數。

有一個指針vector用於保存類A,B,C:

std::vector& Elements;

寫入文件的時候,我是這樣的:

for (auto element:Elements)
element-&>WriteFile(file);

但是讀文件的時候我就只有先讀出type,再

switch (type)
{
case 1:
A a;
a.ReadFile(file);
break;
case 2:
//省略B,C類
}

有什麼辦法可以不用在最後一個switch語句中每個類都實例化一次然後讀文件嗎?


從文件中序列化出類這一步是無法避免if/switch的。如果你一定要讓自己的強迫症舒服一點的話,那你就把這個東西做成數組,type變成下標,內容是什麼自己想。以後數組不行了,就用map,key變成字元串(恭喜你重新發明了反射


這個如果要避免 switch if,只能用傳說中的 stateful metaprogramming……(


首先,虛函數的運行時多態需要指針來體現。

然後C++要實現「工廠模式」的話,硬編碼還是省不了的……根據type來決定構建哪個類還是要得有的。

不過把構造類與read操作是要分離開好一些的


同學你聽說過protobuf嗎


你可以嘗試用抽象工廠來實現,但是type判斷是必有的,不一定是switch的形式。


可以參考一下v社自己弄的一套類似json的keyvalue系統,讀文件的時候直接把文件解析成一堆CKeyValue組成的樹狀結構,然後想要什麼直接找對應的kv-&>GetXXX()就是了,雖然效率會低一點。


遇到過兩次這種情況,對象序列化存的是xml格式,因為既有屬性,又可能有子節點的層級,結構比json 要清晰些。反序列化用的可能叫工廠模式,有個key-creator的map用來查找creato,同時也支持註冊creator。對象的屬性設計分為兩類,一種是每個對象的屬性也是用若干key-value的map存,這樣屬性解析可以用通用函數。另外一種是普通的欄位,則只能單個解析了,但是一般的可以用宏來簡單配置對象的序列化和反序列化。


推薦閱讀:

如何理解面向組合子編程?
C語言的設計模式有哪些?
面向對象、面向服務、面向組件三種編程模式有什麼區別?分別適用於哪些領域的開發?
Swift code will run on Google's Fuchsia OS

TAG:編程語言 | 面向對象編程 | C |