【问题标题】:How to store structure as (void *) and retrieve same如何将结构存储为(void *)并检索相同
【发布时间】:2021-09-01 01:38:02
【问题描述】:

我正在学习使用 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;
}

【问题讨论】:

  • void get(void** val){*val = data;} 或者只返回数据而不是使用输出参数。
  • 参数传值,指针也不例外。
  • @463035818_is_not_a_number 我很确定在 c++ 中将 malloc 用于 POD 是有效的(尽管绝对不是现代 c++ 惯用的)。
  • @MikeVine 哦,对了,我太偏执了。评论已删除。

标签: c++ casting void-pointers


【解决方案1】:

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

void *get(){
    return data;
}

随后:

void *data = rsrc->get();

此外,使用 new 而不是 malloc 来构造对象是惯用的,尽管对于 POD(plain-old-data)类型,两者都有效。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      对于用户创建的类,大多数人指定类的首字母为大写:

      class Resource {};
      class Student {};
      

      这取决于您的编码标准。是否使用camel case 无关紧要,只要您使用一致的naming convention

      此外,我们通常会尽量防止 C++ 中类型信息的丢失。当然,您可以使用 C 风格的强制转换,它只会将指针重新解释为指定的类型,但这被认为是不好的风格,可能会导致问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-06
        • 2014-12-29
        • 1970-01-01
        • 2012-02-03
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        相关资源
        最近更新 更多