最近我决定在一个项目中工作,我需要一个对象,它可以是任何数据类型(uint8、unint16、uint32 或 unint64)(我可能想添加这些只是数字,并且只会是+、-、*、/、<<、>>。我查看了 Boost::variant,但是在尝试之后,我一直很沮丧,因为我无法正确检索数据。啊 - 应用访问者?所以我研究了其他方法来模拟这一点。
低于这一点是实验,似乎错误,非常错误:
(我想说我对多态/继承不是太深入,所以提前抱歉)我尝试创建一个基础对象,然后将基础对象设置为派生类 - 派生模板类是我选择的数据类型(uint8、uint16、uint32 或 uint64)之后,我可以简单地检索我之前使用 get() 方法设置的数据:
DynamicVariable *a = new TypedDynamicVariable<unsigned int>(12345);
std::cout << a->get() << std::endl;
delete a;
或者:
DynamicVariable *a = new TypedDynamicVariable<unsigned char>(255);
std::cout << a->get() << std::endl;
delete a;
表示示例:
unsigned int a = 100;
unsigned char b = 20;
std::cout << a + b << std::endl;
导致:错误 C2039:“get”:不是“DynamicVariable”的成员
我收到了 BASE 类中不存在 a->get() 的错误。我在网上搜索找到这段代码(dynamic_cast):
DynamicVariable *a = new TypedDynamicVariable<int>(12345);
TypedDynamicVariable<int>* p = dynamic_cast<TypedDynamicVariable<int>*>(a);
std::cout << p->get() << std::endl;
正如您所看到的,这对我来说: TypedDynamicVariable* < int > * 和 dynamic_cast*>(a) (指定它是一个 INT)违背了我想做的全部目的。
下面是我从许多不确定的在线阅读时间中整理出来的课程。它似乎有我的“解决方案”的大致轮廓,但是我知道缺少重要的内容/需要改进 apon,或者实际上多态性毕竟不是我想要的/不能使用。
class DynamicVariable
{
public:
//constructor & virtual destructor
DynamicVariable() {}
virtual ~DynamicVariable() {}
};
//unique data
template<typename T>
class TypedDynamicVariable : public DynamicVariable
{
private:
T _data;
public:
//constuctor
TypedDynamicVariable (const T& data) : _data(data) { }
//prototypes
void set (const T& data) { _data = data; }
T get (void) { return _data; }
};
如果有人可以帮助我了解上述课程的问题并指导我找到一个可行的解决方案,或者如果它们确实是我真正想要的,请使用 boost::variant 为我指明正确的方向。
谢谢。