C++ 在类(c+;+;)中存储固定的已知数据

C++ 在类(c+;+;)中存储固定的已知数据,c++,class,dictionary,oop,C++,Class,Dictionary,Oop,我有这个类来存储固定的已知数据。每个对象都应该有自己的唯一id,这样,当用户调用皮带(1)时,将创建一个正确值为名称,周长,无点的对象。在没有开关盒的情况下,有没有更好的方法来定义这些其他参数?我应该用另一种方式来设计吗?这种实施的缺点是什么 类皮带{ 私人: 内部id; std::string _name; 国际周界; 积分; 公众: 传送带(内部id){ _id=id; 开关(id) { 案例1: _name=“NEO”; _周长=100; _nOfPoints=10; 打破 案例2: _n

我有这个类来存储固定的已知数据。每个对象都应该有自己的唯一id,这样,当用户调用
皮带(1)
时,将创建一个正确值为
名称
周长
无点
的对象。在没有开关盒的情况下,有没有更好的方法来定义这些其他参数?我应该用另一种方式来设计吗?这种实施的缺点是什么

类皮带{
私人:
内部id;
std::string _name;
国际周界;
积分;
公众:
传送带(内部id){
_id=id;
开关(id)
{
案例1:
_name=“NEO”;
_周长=100;
_nOfPoints=10;
打破
案例2:
_name=“PED”;
_周长=200;
_nOfPoints=12;
打破
案例3:
_name=“ADT”;
_周长=400;
_nOfPoints=20;
打破
}
}
};

如果您只需要处理一组固定的值,我建议在
Belt
中创建
static const
实例。这样做的好处是可以避免任何查找开销,并处理无效输入(例如,有人将
INT_MAX
传递给构造函数)。例如:

class Belt {
    private:
        int _id;
        std::string _name;
        int _perimeter;
        int _nOfPoints;

        Belt(int id, name, perimeter, nOfPoints)
          : _id{id}, _name{std::move(name)}
          , _perimeter{perimeter}, _nOfPoints{nOfPoints} { }

    public:
        static const Belt neo(1, "NEO", 100, 10);
        static const Belt ped(2, "PED", 200, 12);
        // ...
};
用户可以通过复制一个现有对象来创建本地
皮带
,并且仍然可以执行所需的任何本地操作

int main() {
    auto myBelt = Belt::neo;
    myBelt.some_member_function();
}

在没有开关盒的情况下,有没有更好的方法来定义这些其他参数

您可以使用私有静态映射来保存原型:

class Belt {
private:
    static const std:map<int,Belt> prototypes;
    int _id;
    std::string _name;
    int _perimeter;
    int _nOfPoints;

    Belt(int id, const std::string name, int perimeter, int nOfPoints)
        : _id(id), _name(name), _perimeter(perimeter), _nOfPoints(nOfPoints) {}
public:
    Belt(int id) {   
        _id = id;
        _name = prototypes[_id]._name;  
        _perimeter= prototypes[_id]._perimeter;  
        _nOfPoints= prototypes[_id]._nOfPoints;  

        // Or simpler instead of the lines above:
        // *this = prototypes[id];
    }
};

const std:map<int,Belt> Belt::prototypes = {
      { 1 , Belt(1,"NEO",100,10) }
    , { 2 , Belt(2,"PED",200,12) }
    , { 3 , Belt(3,"ADT",400,20) }
};
类皮带{
私人:
静态常数标准:地图原型;
内部id;
std::string _name;
国际周界;
积分;
传送带(整数id、常数标准::字符串名称、整数周长、整数nOfPoints)
:_id(id),_name(name),_permiture(permiture),_nOfPoints(nOfPoints){}
公众:
传送带(内部id){
_id=id;
_名称=原型[_id]。_名称;
_周长=原型[_id]。_周长;
_nOfPoints=原型[_id]。_nOfPoints;
//或更简单,而不是上面的行:
//*这=原型[id];
}
};
常量标准:地图带::原型={
{1,带(1,“近地天体”,100,10)}
,{2,皮带(2,“PED”,200,12)}
,{3,皮带(3,“ADT”,400,20)}
};


此外,您可能有兴趣看看。这是您可以使用的另一种技术,并为您提供了更好的灵活性。

为什么不使用正确的值创建
静态约束带呢?@Stephen Neweell怎么会这样?通过声明静态常量结构?如果这个Belt类应该有数据操作的方法怎么办?
std::map
的另一个替代方法是创建包含ID和Belt对象的结构的常量数组。这样就不需要运行时初始化(std::map
需要运行时初始化)。“表”可以放在一个固定的内存区域中,并可以直接访问。您可以使用一个Belt对象数组。如果您这样做了,您可以创建一个对象,该对象具有
皮带x=皮带[1]
或者如果希望数组是类的私有成员并将整数传递给构造函数,则