如何将空指针转换为类数组

How to convert a void pointer to array of classes

本文关键字:数组 转换 空指针      更新时间:2023-10-16

我正在尝试将 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*'我该怎么做呢?

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

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

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

void callback(void* p)
{
    Person* person = static_cast<Person*>(p);
    for ( int i = 0; i < 10; ++i)
        std::cout << person[i].age_m << "n";
}
您需要

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

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

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

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