我正在尝试将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*'
我该如何去做呢?
答案 0 :(得分:4)
如果您希望能够恢复大小,则需要使用一个在运行时跟踪大小的容器。我建议使用std :: vector而不是原始数组。
std::vector<person> p(10);
static_cast<std::vector<Person>*>(val);
答案 1 :(得分:0)
您需要将其投射到person *
。数组衰减为指针,因此将void指针强制转换为person
指针可以正常工作。明确的,更多的C ++和更好的方法是:
std::cout << static_cast<person *>(val) [i].name;
C方式也有效,但需要额外的括号,并且当你有适当的演员阵容时非常不安全/邪恶:
std::cout << ((person *)val) [i].name;
答案 2 :(得分:0)
以下代码有效。但是你怎么知道阵列的大小?
void callback(void* p)
{
Person* person = static_cast<Person*>(p);
for ( int i = 0; i < 10; ++i)
std::cout << person[i].age_m << "\n";
}