C++ 如何在C+;中创建包含多种类型对象的列表+;
情景: 我是用C++在OOP中设计阶段的。我只想设计一个包含四种动作类型的移动动作。这些操作具有相同的公共变量和函数。这些类也有一些离散变量和函数。类_Action(基类)中的相同函数和变量 下面给出的其他四种类型的动作继承了类_动作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
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;
}
}