gpt4 book ai didi

c++ - 如何提供单个函数通过基类指针获取任何派生对象的数据?

转载 作者:行者123 更新时间:2023-11-27 23:32:58 27 4
gpt4 key购买 nike

我有如下代码。Base是基类,D1、D2、D3是派生类。D1、D2 和 D3 类对象可以分别保存 int、float 和 double 值。我有一个基类指针 vector 。它们中的每一个都可以指向任何派生类对象。通过基类指针,我应该能够获取任何派生类中存在的数据。

enum Type
{
INT,
FLOAT,
DOUBLE
};
struct Data
{
Type type;
union
{
int iVal;
float fVal;
double dVal;
};
};
class Base
{
public:
virtual Data getData() = 0;
};
class D1: public Base
{
int i;
public:
virtual Data getData()
{
Data data;
data.type = INT;
data.iVal = i;
return data;
}
};

class D2: public Base
{
float f;
public:
virtual Data getData()
{
Data data;
data.type = FLOAT;
data.fVal = f;
return data;
}
};

class D3: public Base
{
double d;
public:
virtual Data getData()
{
Data data;
data.type = DOUBLE;
data.dVal = d;
return data;
}
};

getData() 返回数据对象。

使用数据对象中的类型,我需要在 union 中提取相应的值。

即使我使用虚函数机制,我也无法避免类型检查。

有没有更好的方法通过单一接口(interface)函数返回数据?

编辑:在我的项目场景中,在运行时它可以生成很少的 D1 对象、很少的 D2 对象等等。我需要将所有这些对象传递给其他模块。所以我用了 vector<Base *>将所有对象传递给下一个模块。有没有更好的方法来传递所有对象?

编辑:存在任何非升压解决方案吗?

最佳答案

一般来说,我宁愿完全避免这种设计。但是,如果您绝对必须这样做,恕我直言,最简单和最快的方法是使用 boost::any .

更新:原样,绝对正确,已注明 boost::variant在这里可能更加方便和高效,因为使用的类型是已知的(感谢您的评论)。

关于c++ - 如何提供单个函数通过基类指针获取任何派生对象的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3608212/

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