gpt4 book ai didi

c++ - 从基类指针获取对两个具有不同类型的派生成员变量的访问。

转载 作者:行者123 更新时间:2023-11-30 05:21:54 24 4
gpt4 key购买 nike

问题是:我有一个源代码,如果由 if/else 语句填充,旨在执行相同的指令,但数据类型不同。我不喜欢这样,我想为这种不同的数据类型创建一个抽象,我可以通过这种方式在之前设置正确的数据类型,然后执行相同的指令。这个想法是删除污染代码的整个 if/else 语句。好吧,我做了很多搜索,似乎我的问题的解决方案是使用多态性。所以,我们到了。上面是我创建的用于执行多态性的类的标题。 Platform 是基类,另外两个 VeroPionner 是派生类。

#ifndef VEHICLE_H
#define VEHICLE_H

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <ransac_project/CarCommand.h>

class Platform{
public:
virtual void setmsg(const double &, const double &) = 0;
//X m_msg; //Some king of genetic type
};

class Vero: public Platform{
public:
ransac_project::CarCommand m_msg;

Vero();
void setmsg(const double &velocity, const double &steering);
};

class Pionner: public Platform{
public:
geometry_msgs::Twist m_msg;

Pionner();
void setmsg(const double &linear_vel, const double &angular_vel);
};
#endif /* VEHICLE_H */

总的来说,我有这样的东西:

Platform* platform;
if(which_car.compare("vero")==0){
Vero vero; platform = &vero;
platform = static_cast<Vero*>(platform);
}
else{
Pionner pionner; platform = &pionner;
platform = static_cast<Pionner*>(platform);
}

到目前为止,还不错。但是,之后,在其他地方有:

int a=0;
int b=0;
platform->setmsg(a,b); //WORKS
platform->m_msg; //DOES NOT WOTK

好吧,最后一条语句不起作用,因为基类没有成员变量 m_msg,我无法创建它,因为它的类型在派生类中有所不同。我还阅读了有关模板和无效指针的信息,但无法找到解决方案。事实上,使用 void 指针我可以做这样的事情:

void* platform;
if(which_car.compare("vero")==0){
Vero vero; platform = &vero;
}
else{
Pionner pionner; platform = &pionner;
}
static_cast<Vero*>(platform)->m_msg;

但事实上,这并不能解决我的问题,因为我在转换过程中明确指出了类型。

这个问题有什么简单的解决方案吗?欢迎任何其他解决此问题的方法。

谢谢

最佳答案

如果m_msg在派生类中可以是不同的类型,那么它不能存在于基类中。 (或者更确切地说,它将被派生类中声明的 m_msg 隐藏。)

即使这样做,编译器也无法在编译时确定其类型,因此它不知道如何处理该语句

platform->m_msg; //DOES NOT WOTK

如您所说,模板可用于解决此问题。 void 指针也可以,但鉴于它们缺乏类型安全性,我不推荐它们,除非替代方法不起作用。

此外,m_ 用于指示通常为私有(private)的成员变量,因此无论如何您都不应该以这种方式使用它。

另外,这个 block :

Platform* platform;
if(which_car.compare("vero")==0){
Vero vero; platform = &vero;
platform = static_cast<Vero*>(platform);
}
else{
Pionner pionner; platform = &pionner;
platform = static_cast<Pionner*>(platform);
}

是一个问题,应该提出一些警告。具体来说,在这样的 block 中:

{
Vero vero; platform = &vero;
platform = static_cast<Vero*>(platform);
}

{...} 定义本地范围。

你正在创建一个新的 Vero,将它的地址分配给 platform,然后 vero 在 block 的末尾被释放将 platform 作为悬空指针。 (有关详细信息,请参阅 Wiki article on dangling pointers。)

还有声明

platform = static_cast<Vero*>(platform);

为什么要给自己分配平台?这是没用的。

关于c++ - 从基类指针获取对两个具有不同类型的派生成员变量的访问。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com