Mat*_*son 18 c++ casting abstract-data-type void-pointers
我有一个C++程序:
struct arguments
{
int a, b, c;
arguments(): a(3), b(6), c(9) {}
};
class test_class{
public:
void *member_func(void *args){
arguments vars = (arguments *) (*args); //error: void is not a
//pointer-to-object type
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n";
}
};
Run Code Online (Sandbox Code Playgroud)
在编译时它会抛出一个错误:
error: ‘void*’ is not a pointer-to-object type
Run Code Online (Sandbox Code Playgroud)
有人可以解释我做错了产生这个错误吗?
bdo*_*lan 25
void *在将其转换为具体类型之前,您将取消引用它.你需要反过来做:
arguments vars = *(arguments *) (args);
Run Code Online (Sandbox Code Playgroud)
这个顺序很重要,因为编译器不知道如何应用*到args(这是一个void *无法被解除引用).你(arguments *)告诉它该怎么做,但为时已晚,因为已经发生了取消引用.
Bare bones示例重现上述错误:
#include <iostream>
using namespace std;
int main() {
int myint = 9; //good
void *pointer_to_void; //good
pointer_to_void = &myint; //good
cout << *pointer_to_void; //error: 'void*' is not a pointer-to-object type
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是错误的,因为它试图取消引用指向void的指针.这是不允许的.
现在运行下面的代码,如果您理解为什么以下代码运行而上面的代码没有运行,那么您将能够更好地了解底层的内容.
#include <iostream>
using namespace std;
int main() {
int myint = 9;
void *pointer_to_void;
int *pointer_to_int;
pointer_to_void = &myint;
pointer_to_int = (int *) pointer_to_void;
cout << *pointer_to_int; //prints '9'
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你*在错误的地方。所以你正在尝试取消引用void*. 试试这个:
arguments vars = *(arguments *) (args);
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n";
Run Code Online (Sandbox Code Playgroud)
或者,您可以这样做:(这也避免了复制构造函数 - 如评论中所述)
arguments *vars = (arguments *) (args);
std::cout << "\n" << vars->a << "\t" << vars->b << "\t" << vars->c << "\n";
Run Code Online (Sandbox Code Playgroud)