【问题标题】:How to convert a void pointer to array of classes如何将 void 指针转换为类数组
【发布时间】:2012-06-17 03:11:51
【问题描述】:

我正在尝试将 void 指针转换为回调函数中的类数组,该回调函数仅支持将 void 指针作为将参数传递给回调的一种方式。

class person
{
    std::string name, age;
};
void callback (void *val)
{
    for (int i = 0; i < 9; i++)
    {
        std::cout << (person [])val[i].name;
    }
}
int main()
{
    person p[10];
    callback((void*)p);
}

我的目标是能够将 person 类的数组传递给回调,然后打印出他们的姓名和年龄等数据。但是,编译器不喜欢我正在做的事情并抱怨error: request for member 'name' in 'val', which is of non-class type 'void*' 我该怎么做呢?

【问题讨论】:

  • 另一种方法是将指针传递给包装对象数组的类。您可以在包装器中有一个方法来执行此打印内容。从回调中,您可以调用包装器的成员函数。

标签: c++ class pointers callback


【解决方案1】:

如果您希望能够恢复大小,则需要使用一个在运行时跟踪大小的容器。我建议使用 std::vector 而不是原始数组。

std::vector<person> p(10);
static_cast<std::vector<Person>*>(val);

【讨论】:

  • 听起来是个好主意。从回调中恢复大小的正确方法是什么?
【解决方案2】:

以下代码有效。但是你怎么知道数组的大小?

void callback(void* p)
{

    Person* person = static_cast<Person*>(p);
    for ( int i = 0; i < 10; ++i)
        std::cout << person[i].age_m << "\n";
}

【讨论】:

    【解决方案3】:

    您需要将其转换为 person *。数组衰减为指针,因此将 void 指针转换为 person 指针按预期工作。更清晰、更 C++ 和更好的方法是:

    std::cout << static_cast<person *>(val) [i].name;
    

    C 方式也可以,但需要额外的括号,并且当你有适当的转换可用时非常不安全/邪恶:

    std::cout << ((person *)val) [i].name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2018-12-10
      • 2012-01-19
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      相关资源
      最近更新 更多