2014-09-02 98 views
0

舉個例子,我有一個類,我存儲關於二進制文件的一些信息:字符串池/實習 - 這是一個好習慣嗎?

class car { 
    char car_manufacturer; 
    //other stuff 
}; 

car_manufacturer的值是值之一:

enum car_manufacturers : char { 
    VOLVO = 0, 
    AUDI, 
    MERCEDES 
}; 

現在這個例子應用中,用戶都希望他們的汽車製造商的字符串表示,而不是一個號碼,所以我創建一個枚舉,其中陣列的順序是一樣的枚舉的字符串表示的數組,所以car_manufacturer可以用作數組索引

std::string car_manufacturers_strings[MERCEDES + 1] = { 
    "Volvo", 
    "Audi", 
    "Mercedes" 
}; 

所以現在加載該文件,並創建一個car對象出來的數據後,我可以簡單地通過car_manufacturers_strings[car.car_manufacturer];

該方案的優點得到了汽車的品牌,作爲一個字符串在於,在文件中,我不必存儲大量重複的字符串,如果汽車是相同的,因此我可以節省很多空間。但是這樣做的缺點是代碼稍微複雜一點。

那麼這是好還是不好的做法?

+1

你可以在你的類中添加一個方法來做到這一點。然後,這些字符串以與製造商枚舉相同的順序存儲在數組中的事實是對用戶隱藏的實現細節。 – MicroVirus 2014-09-02 11:09:32

+0

@MicroVirus這與我在應用程序中實現的完全一樣,汽車是一個類比。實際上,我確實實現了相同的'car.get_car_manufacturer_name();' – user3680400 2014-09-02 11:12:32

回答

1

這是非常標準的做法,將枚舉數的字符串表示形式作爲數組提供。

的一點是:

std::string car_manufacturers_strings[MERCEDES + 1] = { 
    "Volvo", 
    "Audi", 
    "Mercedes" 
}; 

房屋字符串文字的二進制文件,以及創建這些文字作爲動態初始化階段std::string對象的副本。

你可能喜歡將其改爲:

char const* const car_manufacturers_strings[MERCEDES + 1] = { 
    "Volvo", 
    "Audi", 
    "Mercedes" 
}; 

因此,它不會不必要創建這些副本。

+0

>在二進制文件中存儲字符串文字,並且在動態初始化階段創建這些文字的副本作爲std :: string對象。我不知道'std :: string'會做到這一點,儘管事後看來,考慮到std :: string能夠調整大小以及什麼是非常有意義的。謝謝! – user3680400 2014-09-02 11:15:50

1

我一般做一個函數,沿着線:

char const * to_string(car_manufacturers cm) { 
    switch (cm) { 
     #define CASE(CM) case CM: return #CM; 
     CASE(Volvo) 
     CASE(Audi) 
     CASE(Mercedes) 
     #undef CASE 
    } 
    return "Unknown"; // or throw, or whatever 
} 

優點:

  • 沒有必要參數轉化爲數字索引,所以它沒有範圍的枚舉工作需要可怕的鑄造;
  • 我的編譯器會發出警告,如果我添加一個枚舉,而無需更新功能(不去掉了重複一樣好,但至少一致性執行)

缺點:

  • switch可能(或者可能不是)不是一個數組查找
  • 資本統計員必須匹配字符串效率較低,所以你必須放下你的神物的SHOUTY_CAPS。有人會說這是一件好事,他們當然傷害了我的眼睛。
  • Ewwww!宏!
相關問題