2014-09-02 87 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!宏!
相关问题