我正在研究音譯工具。我有兩個模塊詞法和翻譯器。 Lexer從輸入文本中生成令牌。根據當前選擇的語言,我必須調用適當的翻譯程序。根據變量的值執行功能 - C++
我想出了幾個想法來做到這一點。首先是創建一個名爲base_translator
的基類,並提供每個譯者必須覆蓋的虛擬方法(translate()
)。現在創建一個工廠translator_factory
並用語言名稱調用create()
。這個工廠將返回適當的實例。
但是,這似乎是工程。所以我想出了另一種方法,我有一個像下面這樣的結構。
struct translator
{
const char* name;
void (*fp)();
};
它只是保留一個語言名稱和一個可以處理它的函數指針。用法如下:
static translator translators[] = {
{"first", first},
{"second", second}
};
const char* language = /* */;
for(int i = 0; i < 2; i++) {
translator *t = translators + i;
if(strcmp(t->name, language) == 0) {
t->fp();
break;
}
}
這種方法非常簡單,易於維護。但我想知道,這是解決問題的最佳方法嗎?你有什麼建議可以讓這個更好嗎?
任何幫助將是偉大的。
你的第二種方法僅僅用C風格模擬C++的運行時多態(虛函數)。與C++中內置的對OOP的支持相比,它沒有任何優勢。 – 2010-03-06 16:44:59