2009-01-28 40 views
0

背景一流的設計建議 - C++

我的工作,其將英語文本equivalant地方語言文本的語音轉換程序。區域語言將具有比英文字母更多的字符,區域語言字體幾乎使用字體中的所有位置(1-255)。

我的程序支持不同的字體,並且我創建了一個字體類,這個字體類將有方法提供對字符的訪問。這個類將有255個方法,每個方法代表每個字符。所有這些都被標記爲虛擬,以便新字體可以覆蓋必要的字符方法。

該字體類中的方法很簡單。所有的方法都是單行的。例子是

string StandardFont::consonant1(){ 
    return "a"; 
} 

string StandardFont::consonant2(){ 
    return "b"; 
} 

.. 

問題

  1. 威爾255個虛擬函數在一個類中做任何性能問題?我知道vtable的東西,但我不確定它在這種情況下會產生多大的影響。
  2. 任何人都可以提出這個班的替代設計?主要設計目標是允許派生類覆蓋必要的方法。我曾考慮將字符添加到容器中,如地圖矢量並提供獲取角色的方法。但是因爲我會有255個物品,而且這個類經常使用,所以我認爲每次我必須循環容器才能獲得角色,這又是一個問題。

有什麼想法?

+0

你可以充實一下描述嗎?這255種方法實際上將做什麼?什麼代碼會打電話給他們? – Charlie 2009-01-28 02:24:15

+0

查理,已完成 – 2009-01-28 02:36:47

回答

2

我建議你使用非ASCII(區域)字符的標準編碼。

的標準編碼被稱爲「統一」,例如http://www.joelonsoftware.com/articles/Unicode.html

總之:在一個類爲您解答......

威爾255個虛擬功能使任何性能問題?

總之:不,它不會。

但是因爲我將有255個項目,並且這個類被頻繁使用,我認爲每次我必須循環容器來獲取角色,這又是一個問題。

與載體或一個固定長度的數組,其長度爲256個,則就不需要循環...代替你可以直接索引,例如:

const char* translations[256] = { 
"a", 
"bee", 
"c!", 
...etc... 
}; 

const char* translate(char c) 
{ 
    //use the character as an index into the array 
    int index = c; 
    //use the translation array (using indexing, not looping) 
    const char* result = translations[index]; 
    return result; 
} 
+0

謝謝克里斯。我也有unicode。但是這個庫預計可以使用ASCII字體。 – 2009-01-28 02:37:29

+0

看起來很有希望。我會試一試。非常感謝 – 2009-01-28 03:18:51

+0

順便說一句,你認爲我可以在這裏使用靜態多態(使用模板)嗎? – 2009-01-28 03:19:35

2

255虛擬功能將通常不會導致性能問題(除非您的類的每個實例都有一個很大的VTable,這會影響緩存)。

但是,255個虛擬功能通常會導致維護噩夢。

如果我正確理解你的描述,那麼你需要的是:

1)方法返回任何你需要的圖像或創建表示在區域語言字符的類,大概。

2)Create是表示字符集的類的層次結構。

3)一個字符集的每個實例將保持從位置映射到字符類的實例。

4)有一個獲取索引並返回對象的函數。這種設計的

一個好處是,你可以使用一些相同的標誌符號(例如,用於數字)有多個字符集。

就這麼說,你爲什麼不使用Unicode和16位字符呢?

0

我認爲使用單一方法訪問字符而不是255個方法會更清晰。想到索引/下標。

您能否澄清一下這些類將如何使用?由於語言和字母不同,因此我覺得你會以同樣的方式引用多個字母。從任何角度來看,信件都是任意的。他們在不同的語言中會有所不同並且不相關。

Unicode的目標是爲您的問題提供解決方案。你有沒有考慮過使用它?

0

解決你的速度的問題,有255種虛擬方法應該不會引起任何特定的性能損失,但通常建議適用:如果你不知道怎麼回事執行,只有這樣,才能找出將是以此爲基準。

話雖這麼說,它很可能有一個更好的辦法來解決這個問題。如果你提供關於這個字體類應該做什麼的更多細節,這將有所幫助。

0

爲什麼不只是有一個255個字符的矢量?

每個「字體」只是在數組中安裝不同的字符?甚至是一個Character類?

,或者您可以使用地圖,還是其他什麼東西

255的方法絕對不是要走的路。