如何将结构存储为(void*)并检索相同的结构



我正在学习使用void指针。在这里,我创建了一个资源类,它可以在(void *)中存储任何类型的结构,现在当我试图在(void *)中获取该结构时,我无法获取相同的数据。请在这里帮忙

#include <iostream>
using namespace std;
class resource{
private:
void* data;
public:
void set(void* val){
data = val;
}
void get(void* val){
val = data;
}

};
class student{
struct st{
int id;
int age;
};
public: 
void func(){
st *st1 = (st *)malloc(sizeof(st));
st1->id = 5;
st1->age = 10;
resource *rsrc = new resource();
rsrc->set((void*)st1);

void *data;
rsrc->get(&data);
st *st2 = (st*)data;
cout<<"get data %d"<<st2->id<<endl;     // HERE I want to get same data back
}
};
int main() {
student *stu = new student();
stu->func();
return 0;
}

只需更改get的签名即可返回void *:

void *get(){
return data;
}

随后:

void *data = rsrc->get();

此外,使用new而不是malloc来构造对象是惯用的,尽管对于POD(纯旧数据(类型,两者都是有效的。

您的get方法不会返回任何值。您正在向其传递一个void指针,在方法内部,您将覆盖该void指针。但是,这只会覆盖void指针的本地副本,不会返回值。正如其他人所说,您要么必须将指针传递给指针,要么使用return语句返回指针的值。

在您的具体案例中,@PaulSanders提出了正确的建议。您应该使用getter/setter模式。此外,他认为应该在idomatic C++中使用newdelete是正确的。

对于用户创建的类,大多数人指定的类都以第一个字母作为标题:

class Resource {};
class Student {};

这取决于您的编码标准。只要使用一致的命名约定,是否使用驼色大小写就无关紧要了。

此外,我们通常会尝试防止C++中类型信息的丢失。当然,您可以使用C样式转换,它只会将指针重新解释为指定的类型,但这被认为是糟糕的样式,可能会导致问题。

最新更新