如何在 C++ 中创建包含多种类型对象的列表

问题描述

场景:

我正在使用 C++ 进行面向对象编程的设计阶段。我只想设计一个有四种动作类型的移动动作。这些操作具有相同的公共变量和功能。这些类也有一些离散变量和函数。位于 Class_Action(基类)中的相同函数和变量。

下面给出的其他四种动作继承了 Class_Action。

class Class_Action_Action_Type_A : public Class_Action 

class Class_Action_Action_Type_B : public Class_Action 

class Class_Action_Action_Type_C : public Class_Action 

class Class_Action_Action_Type_D : public Class_Action 

我想将所有移动操作保存在一个列表中,泛型类型为 Class_Move。 Class_Move 继承所有 Action 类型。它的错误是“没有重载函数的实例对参数列表进行数学运算。”

我有以下问题:

1-) 如何申请上述状态?

2-) 如您所知,如果我从 Class_Move 继承所有四个动作类,Class_Move 的每个初始化都包含其他类成员函数和变量)。例如,当我到达 Class_Move 元素时,我想将 Action_Type_A 添加到 Class_Move,它包含位于 Action_Type_B 中的 set_action_type_B_time 变量。如何避免参数冗余?

3-) 用 OOP 设计这些问题的最佳方法是什么。

4-) 在这种情况下可以使用哪种设计模式? (我正在尝试应用构建器模式)

谢谢,

我有以下课程:

-------------------------------------------------------------------------
Class_Action.h :

class Class_Action
{
protected:
    float action_time_f32;               
    float battery_consumption_result_f32;    
    float battery_consumption_value_f32;                                             
public:

    Class_Action                             ();

    void     update_vehicle_current_altitude ();
    void     set_battery_consumption_value   (float p_battery_consumption_value); 
    void     set_battery_consumption_result  (float p_battery_consumption_result);
    void     set_Action_time                 (float p_action_time);

    float    calc_battery_consumption        ();
    float    get_battery_consumption_value   ();
    float    get_battery_consumption_result  ();
    float    get_action_time                 ();

};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Class_Action_Action_Type_A.h :

class Class_Action_Action_Type_A : public Class_Action 
{
private:
    float  end_point_f32;       
    float  start_point_f32;                                
    float  action_type_A_rate_f32;         
public:
    Class_Action_Action_Type_A                   ();
    Class_Action_Action_Type_A                   (float battery_consumption_value_f32,float action_type_A_rate_f32,float start_point_f32,float end_point_f32);
    void     update_vehicle_current_altitude     ();
    void     set_end_point                       (float p_end_point);
    void     set_start_point                     (float p_start_point);
    void     set_action_type_A_rate              (float p_action_type_A_rate);

    float  calc_battery_consumption              ();  
    float  calc_action_type_A_time               ();  
    float  get_end_point                         ();
    float  get_start_point                       ();
    float  get_action_type_A_rate                ();
};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Class_Action_Action_Type_B.h :

class Class_Action_Action_Type_B : public Class_Action
{
private:
    uint16_t  action_type_B_time_u16;                                                   
public:
    Class_Action_Action_Type_B                  ();
    Class_Action_Action_Type_B                  (float         p_battery_consumption_value,uint16_t      p_action_type_B_time_u16);
    void      update_vehicle_current_altitude();
    void      set_action_type_B_time                (uint16_t  p_action_type_B_time);
    float     get_action_time                       ();
    uint16_t  get_action_type_B_time                ();
    float     calc_battery_consumption              ();   



};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Class_Action_Action_Type_C.h :

class Class_Action_Action_Type_C : public Class_Action
{

private:
    float destination_distance_f32;
    float vehicle_speed_f32;    
public:
    Class_Action_Action_Type_C                  ();
    Class_Action_Action_Type_C                  (float battery_consumption_value_f32,float destination_distance_f32,float vehicle_speed_f32);
    void    update_vehicle_current_altitude     ();
    void    set_destination_distance            (float p_destination_distance);
    void    set_destination_vehicle_speed       (float p_vehicle_speed);

    float   calc_battery_consumption            ();
    float   calculate_flight_time               ();
    float   get_destination_distance            ();
    float   get_destination_vehicle_speed       ();

    
};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Class_Action_Action_Type_D.h :

class Class_Action_Action_Type_D : public Class_Action
{
private:
    float  end_point_f32;       
    float  start_point_f32;                                
    float  action_type_D_rate_f32;         
public:
    Class_Action_Action_Type_D                   ();
    Class_Action_Action_Type_D                   (float battery_consumption_value_f32,float action_type_D_rate_f32,float end_point_f32);
    void     update_vehicle_current_altitude     ();
    void     set_end_point                       (float p_end_point);
    void     set_start_point                     (float p_start_point);
    void     set_action_type_D_rate              (float p_action_type_D_rate);

    float  calc_battery_consumption            ();   
    float  calc_action_type_D_time             ();  
    float  get_end_point                       ();
    float  get_start_point                     ();
    float  get_action_type_D_rate              ();

};
-------------------------------------------------------------------------

-------------------------------------------------------------------------
Class_Move.h:

class Class_Move: public Class_Action_Action_Type_A,public Class_Action_Action_Type_B,public Class_Action_Action_Type_C,public Class_Action_Action_Type_D
{                                    
public:

    Class_Move                              ();

};
-------------------------------------------------------------------------


-------------------------------------------------------------------------
main.c:

#include <list.h>
#include "Class_Move.h"
int main()
{
    
    list<Class_Move*>           list_Moves;
    list<Class_Move*>::iterator iter_Moves;
    
    list_Moves.push_back(new Class_Action_Action_Type_A());
    list_Moves.push_back(new Class_Action_Action_Type_B());
    list_Moves.push_back(new Class_Action_Action_Type_C());
    list_Moves.push_back(new Class_Action_Action_Type_D());
}

解决方法

我会扭转局面。然而,首先,这些动作是在一个班级上吗?如果它们只是动作,为什么要称它们为 Class_Action?

class Class_Action

对比

class Action

这只是一个命名问题。无论如何,我会这样做:

class Action {
};

class Move_Action: public Action {
};

...

std::vector<Action *> vector;
-or-
std::vector<std::shared_ptr<Action>> vector;

标准的多态性。

,

这里是我提到的:

    list<Action*> list_All;
    list<Action*>::iterator iter_All;
    for (iter_All = list_All.begin(); iter_All != list_All.end(); iter_All++)
    {
        if (typeid((*iter_All)).name() == typeid(Action_A).name())
        {
            cout << A << endl;
        }
        if (typeid((*iter_All)).name() == typeid(Action_B).name())
        {
            cout << B << endl;
        }
        if (typeid((*iter_All)).name() == typeid(Action_C).name())
        {
            cout << C << endl;
        }
        if (typeid((*iter_All)).name() == typeid(Action_D).name())
        {
            cout << D << endl;
        }
    }