Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+;中创建包含多种类型对象的列表+;_C++_Oop_Design Patterns_Object Oriented Analysis - Fatal编程技术网

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

C++ 如何在C+;中创建包含多种类型对象的列表+;,c++,oop,design-patterns,object-oriented-analysis,C++,Oop,Design Patterns,Object Oriented Analysis,情景: 我是用C++在OOP中设计阶段的。我只想设计一个包含四种动作类型的移动动作。这些操作具有相同的公共变量和函数。这些类也有一些离散变量和函数。类_Action(基类)中的相同函数和变量 下面给出的其他四种类型的动作继承了类_动作 class Class_Action_Action_Type_A : public Class_Action class Class_Action_Action_Type_B : public Class_Action class Class_Action

情景:

我是用C++在OOP中设计阶段的。我只想设计一个包含四种动作类型的移动动作。这些操作具有相同的公共变量和函数。这些类也有一些离散变量和函数。类_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。类\u Move继承所有动作类型。它会出错,因为“没有重载函数的实例与参数列表匹配。”

我有以下问题:

1-)我如何应用上述状态

2-)如您所知,如果我从类\u Move继承所有四个action类,则类\u Move的每次初始化都会保留其他类成员(函数和变量)。例如,当我到达元素Class\u Move时,我想将Action\u Type\u A添加到Class\u Move中,因为Class\u Move包含位于Action\u Type\u B中的set\u Action\u Type\u B\u时间变量。如何避免参数冗余

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 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_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());
}
-------------------------------------------------------------------------
h类行动:
集体诉讼
{
受保护的:
浮动动作时间f32;
浮充电池\消耗\结果\ f32;
浮充电池\消耗\值\ f32;
公众:
集体诉讼();
无效更新车辆当前高度();
无效设置电池消耗值(浮动电池消耗值);
无效设置电池消耗结果(浮动电池消耗结果);
无效设置动作时间(浮动动作时间);
浮法计算电池消耗量();
浮动获取电池消耗值();
浮子获取电池消耗结果();
float get_action_time();
};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
类别动作类型动作类型动作类型h:
类别类别行动类别A:公共类别行动
{
私人:
浮动端点_f32;
浮动起始点f32;
浮动动作类型、浮动率32;
公众:
类动作动作类型动作类型动作类型动作类型类型动作类型类型动作类型类型类型动作类型类型类型动作类型类型类型动作类型类型类型类型动作类型;
类别动作类型A(浮充电池消耗值f32,
浮动动作类型比率f32,
浮动起点\u f32,
浮动端点(f32);
无效更新车辆当前高度();
无效集\端点\点(浮动p \端点);
无效设置起点(浮动起点);
无效集合动作类型动作速率(浮动动作类型动作速率);
浮法计算电池消耗量();
浮动计算动作类型时间();
float get_end_point();
float get_start_point();
float get_action_type_A_rate();
};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
类别行动类型行动类型h:
类别类别行动类别B:公共类别行动
{
私人:
uint16动作类型时间16;
公众:
类动作类型B();
类别动作类型B(浮子电池消耗值),
uint16\u t p\u动作类型\u B\u时间\u 16);
无效更新车辆当前高度();
无效集合动作类型动作时间(uint16动作类型动作时间);
float get_action_time();
uint16\u t get_action\u type_B_time();
浮法计算电池消耗量();
};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
类别动作类型动作类型动作类型h:
类别类别行动类别C:公共类别行动
{
私人:
浮动目的地距离f32;
浮动车辆速度f32;
公众:
类动作类型C();
类别动作类型C(浮充电池消耗值f32,
浮动目的地距离f32,
浮动车辆(速度)(f32);
无效更新车辆当前高度();
无效设置目的地距离(浮动目的地距离);
无效设置目的地车速(浮动车速);
浮法计算电池消耗量();
浮动计算飞行时间();
float get_destination_distance();
浮动获取目的地车辆速度();
};
-------------------------------------------------------------------------
-------------------------------------------------------------------------
类别行动类型行动类型h:
类别类别行动类别D:公共类别行动
{
私人:
浮动端点_f32;
浮动起始点f32;
浮动动作类型和浮动速率f32;
公众:
类动作类型D();
类别动作类型D(浮充电池消耗值f32、,
浮动动作类型和浮动率f32,
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;
        }
    }