这个问题之前可能已经回答过,但是经过两天的搜索,我找不到解决方案。
我制作了一个堆栈类,其中存储__data
:
class __data
{
private:
void* __p;
__datatype __type;
public:
__data(void);
__data(int i);
__data(double d);
__data(char* s);
__data(void (*f)(Stack));
bool IsFunction(void);
bool IsInteger(void);
bool IsNumber(void);
bool IsString(void);
void* Get(void);
};
我创建了这个类,因为堆栈将能够存储字符串、函数(指向函数的指针)、双精度数和整数。
问题是当我将整数或双精度压入堆栈然后弹出它并获取指向数据的指针(void* Get(void)
)时,我通过打印出它的值来调试它,因此我基本上有这个:
void print(Stack s)
{
__data d = s.Pop();
if (d.IsNumber()) // BUG: never the number I pass to __data
std::cout << "IsNumber - " << *((double*)d.Get()) << std::endl;
else if (d.IsInteger()) // BUG: it always prints out 1
std::cout << "IsInteger - " << *((int*)d.Get()) << std::endl; //
else if (d.IsString())
std::cout << "IsString - " << (char*)d.Get() << std::endl;
else if (d.IsFunction())
{
std::cout << "IsFunction - " << d.Get() << std::endl;
((void (*)(Stack))d.Get())(s); // calls the function
}
}
我不知道可能出了什么问题,也许是我分配的方式__p
(返回的指针Get()
),这些是__data
整数和双精度的构造函数:
__data::__data(int i)
{
__type = _dt_integer;
__p = &i;
}
__data::__data(double d)
{
__type = _dt_number;
__p = &d;
}
所以基本上我的问题是当我尝试获取返回的整数或双精度时,void*
它要么给我一个1
(整数)或2.13171e-314
(双精度)值。
感谢您抽出宝贵的时间,如果已经有答案,我们很抱歉。
编辑:
我将重写 Stack 类并改用联合。这似乎是实现我的目标的最佳方法。