【发布时间】:2012-07-16 12:55:57
【问题描述】:
这个问题之前可能已经回答过了,但是经过两天的搜索,我找不到解决方案。
我做了一个堆栈类来存储__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 类并改用联合。这似乎是实现我的目标的最佳方法。
【问题讨论】:
-
为什么要强调类名?
-
顺便说一句,你不应该使用那些名字(以 2 _s 开头)stackoverflow.com/questions/228783/…
-
为什么要使用指针?只需使用
union(不要忘记复制任何字符串,并删除析构函数中的重复项)。
标签: c++ pointers void-pointers