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)