如何解决如何将结构存储为 (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 指针的本地副本,并且不会返回值。正如其他人所说,您要么必须传递指向指针的指针,要么使用 return 语句返回指针的值。
,在您的具体情况下,@PaulSanders 提出了正确的建议。您应该使用 getter/setter 模式。此外,他是正确的,您应该在 idomatic C++ 中使用 new
和 delete
。
对于用户创建的类,大多数人将类指定为首字母大写:
class Resource {};
class Student {};
这取决于您的编码标准。只要您使用一致的 camel case,是否使用 naming convention 并不重要。
此外,我们通常会尝试防止在 C++ 中丢失类型信息。当然,您可以使用 C 风格的强制转换,它只会将指针重新解释为指定的类型,但这被认为是糟糕的风格并且可能会导致问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。