【发布时间】:2020-02-25 08:42:25
【问题描述】:
我有一个基类(机器人),根据传递给程序的参数,我想将机器人指针向下转换为特定的派生类。机器人类具有在每个派生类中定义的虚函数。
到目前为止,我可以创建基类的指针,并在条件语句中创建一个派生类,然后将基类动态转换为该派生类。在条件内,指针按预期工作,但在离开条件语句后,派生类超出范围,函数返回虚拟。有没有办法保留指向派生类的指针?
class vehicles{
public:
virtual void print_state(int state_ind, ofstream& file){}
};
class hovercraft : public vehicles{
public:
hovercraft(
int L_in, int W_in,
double start_x, double start_y,
double goal_x, double goal_y)
{
L = L_in;
W = W_in;
start_state.x = start_x;
start_state.y = start_y;
goal_state.x = goal_x;
goal_state.y = goal_y;
Tree.push_back(start_state);
}
void print_state(int state_ind, ofstream& file){
state s = Tree[state_ind];
file<<s.phi<<","<<
s.u<<","<<
s.v<<","<<
s.r<<","<<
s.x<<","<<
s.y<<"\n";
}
private:
struct state{
double g=0;
double u=0;
double v=0;
double r=0;
double x=0;
double y=0;
double phi=0;
int p=0;
};
int L,W;
state start_state, goal_state, state_sample;
vector<state> Tree;
};
int main(int argc, char* argv[])
{
ifstream infile;
string vehicle_name;
vehicles* vehicle;
int start, goal;
for(int i=0; i < argc; i++){
if (string(argv[i])=="-m"){
infile.open (argv[i+1]);
} else if (string(argv[i])=="-v"){
vehicle_name = string(argv[i+1]);
}
}
ofstream file_out;
file_out.open ("state.csv");
if(vehicle_name == "hovercraft"){
int L, W;
double start_x, start_y, goal_x, goal_y;
infile >> L;
infile >> W;
infile >> start_x;
infile >> start_y;
infile >> goal_x;
infile >> goal_y;
hovercraft my_vehicle(L,W, start_x, start_y, goal_x, goal_y);
hovercraft* vehicle = dynamic_cast<hovercraft*>(&my_vehicle);
} else {
cout<<"Invalid Vehicle: "<<vehicle_name<<"\n Exiting...\n";
return 0;
}
vehicle->print_state(0);
}
这是从实际代码中简化的,但我认为它抓住了问题所在。我想要的结果是 print 在 if 语句中和之后的工作相同,但在它之后总是会打印“no vehicle”。
【问题讨论】:
-
这是一个有用的经验法则。如果你认为你需要沮丧,很可能你做错了什么。
-
即您应该改用虚函数。
-
您不会在任何地方向下转换 - 您的转换与指针已经具有的类型相同。您是否有一个有问题的示例可以进行任何有意义的强制转换?
-
我编辑了这篇文章,试图更具体地展示我在做什么。我在 if 语句之后显示打印状态,但在实际代码中,我将为所选机器人进行运动规划。
标签: c++ inheritance downcast