gpt4 book ai didi

C++ void* to int* - 获取 int* 指向的 int

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

这个问题以前可能有人回答过,但是经过两天的搜索我找不到解决方案。

我创建了一个存储__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);
};

我创建这个类是因为堆栈将能够存储字符串、函数(指向函数的指针)、 double 和整数。

问题是当我将一个整数或 double 压入堆栈然后将其弹出并获取指向数据的指针时 (void* Get(void)) 我正在通过打印来调试它它很有值(value),所以我基本上有这个:

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 整数和 double 的构造函数:

__data::__data(int i)
{
__type = _dt_integer;
__p = &i;
}
__data::__data(double d)
{
__type = _dt_number;
__p = &d;
}

所以基本上我的问题是,当我尝试获取返回的 void* 指向的整数或 double 时,它要么给我 1 (整数)的值,要么 2.13171e-314(双)。

感谢您抽出宝贵时间,如果已经有答案,我们深表歉意。

编辑:

我将重写 Stack 类并改用 union 。这似乎是实现我的目标的最佳方法。

最佳答案

你的问题是你保存了一个临时对象的地址。例如:在此示例中,您保存了临时 double d 的地址。

__data::__data(double d)
{
__type = _dt_number;
__p = &d;
}

该对象仅存在于当前作用域(函数)中,地址之后无用,因为它很可能被堆栈中的其他内容覆盖。

我建议的解决方案是创建一个动态分配的拷贝:

__data::__data(double d)
{
__type = _dt_number;
__p = new double(d);
}

这将创建一个对象,该对象将持续存在,直到您使用 delete 手动释放指针。您应该在 __data 的析构函数中执行以下操作:

__data::~__data()
{
delete __p;
}

更新:我强烈建议您不要使用 char * 作为您的字符串类型,而是使用 C++ 等效的 std::string。你也可以看看图书馆 boost::any ,这基本上与您想要实现的目标相同,但使用的是模板。

关于C++ void* to int* - 获取 int* 指向的 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11504785/

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