为具有多种变体的类存储默认值的推荐方法是什么?

时间:2018-03-01 12:51:39

标签: c++

我有一个具有多个属性的类,默认属性值会根据参数而改变。

例如,我们有一个汽车类如下。

class Car {
    public:
        Car(int model);
        ~Car();

        int getFuelTankCapacity() const;
        void getTorque();
        void getCC();

    private:
        int fuelTankCapacity;
        int cc;
        int torque;
};

假设我们想要在创建时根据型号初始化Car对象,并假设有30个或更多模型。什么是正确的方法?我们应该有类似下面的东西吗?

Car::Car(int model)
{
    switch(model) {
        case swift:
            .....
        case rover:
            .....
    }
}

或者我们应该使用工厂类?我觉得工厂级不适合,因为模型太多了。有什么建议吗?

我刚刚开始研究基于C ++的项目。请原谅我并帮忙。

以上是上述示例的略微变体。我只看到编辑选项以添加更多信息。如果不正确,请提出建议。

假设我们需要为一系列手机编写应用程序并希望拥有相同的固件。假设所有手机都具有相同的处理器,区别仅在于传感器,相机分辨率等接口设备。

假设我要为接近传感器,相机创建类。

启动时,应用程序应该根据模型获得预定义的功能(假设应用程序可以某种方式获取模型)。知道模型后,它应该使用默认值初始化对象。

typedef enum _model_e {
    eMOB12MP,
    eMOB8MP,
    eLASTMODEL
};

typedef struct _camera_info_t {
    resolution_e res;
    ..........
}camera_info_t;

typedef struct _prox_sensor_t {
    bool supported;
    ........
}prox_sensor_t;

typedef struct _config_t {
    camera_info_t cam;
    prox_sensor_t prox;
    ....
}config_t;

static const config_t configs[] =
{
    { // model eMOB12MP
        .cam =
         {
            .res = 12MP,
            ........
         },
        .prox = 
         {
            .supported = false,
            ............
         },
         ........
    },
    { //eMOB8MP
        .cam =
        {
            .res = 8MP,
            ........
        },
        .prox =
        {
           .supported = true,
           ............
        },
        ........
    },
}

config_t *get_config(model_e model)
{
    config_t *ptr = NULL;

    if (model < eLASTMODEL && model >= 0) {
        ptr = configs[(int)model];
    }

    return ptr;
}

在main函数中,我将调用get_config()并根据配置初始化所有对象。提出上述方法的唯一原因是,无论何时添加可以使用相同固件支持的新模型,都需要在一个地方进行更改。这是对的吗?

谢谢,
的Subbarao

1 个答案:

答案 0 :(得分:1)

这听起来像Factory Pattern的用例。 wiki中的例子(PHP一,但仍然有用的想法)甚至使用汽车。

您可以实现一个使用寄存器方法的变体,您可以在工厂中注册~30个模型。然后工厂使用适当的默认值来创建实例。这些默认值需要在某处提供给工厂(很可能是在单独的头文件中)