如何在c++中使用void指针(泛型)访问类成员

How to access class members using void pointer(generic) in c++

本文关键字:泛型 访问 成员 指针 void c++      更新时间:2023-10-16

code:我想访问类成员函数显示使用泛型ptr p…我该怎么办?

#include "stdafx.h"
#include<iostream>
using namespace std;
class car
{
public:  
int i,j;
  car():i(5),j(9){};
  car(int a,int b):i(a),j(b){}
  void display();
};
void car::display()
    {   cout<<i<<j;}
void main()
{
   car *obj=new car;
   void *p=obj;
***//how to access 'display() or i or j' using 'p'***
}

您需要在每次使用void指针时声明如何处理它。这样做的方法是使用(car*)p

car *obj=new car;
void* p;
p =obj;
((car*)p)->display();
system("pause");

很奇怪,当你声明一个void*类型的数据时,数据没有类型信息,
意味着你不知道数据的内容,它可以是car,也可以是trunk, float,int…为什么要做这个转换呢?

既然你在问题中标记了C++,我将在C++上回答这个问题

对于这些类型的转换,使用静态转换:static_cast,它可以在指向相关类的指针之间进行转换,不仅可以向上转换(从指针到派生到指针到基),还可以向下转换(从指针到基到指针到派生)。在运行时期间不执行任何检查来保证被转换的对象实际上是目标类型的完整对象。因此,由程序员来确保转换是安全的

那么回到你的代码:

#include<iostream>
using namespace std;
class car
{
public:
    int i, j;
    car() :i(5), j(9){};
    car(int a, int b) :i(a), j(b){}
    void display();
};
void car::display()
{
    cout << i << j;
}
void main()
{
    car *obj = new car;
    void *p = obj;
    //convert back to car from void. 
    car *casted_void_p = static_cast<car*>(p); //not safe - you may lose data or cause run time errors if casting from wrong object
    casted_void_p->display();
}