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

时间:2014-06-13 04:18:15

标签: c++ visual-studio-2012 generic-programming

代码:我想使用通用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'***
}

3 个答案:

答案 0 :(得分:0)

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

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

system("pause");

答案 1 :(得分:0)

很奇怪,你知道,当你声明一个void *的数据时,那么数据没有类型信息,那个
意味着你不知道数据的内容,它可能是汽车,也可能是一个主干,浮动,整数...... 那你为什么要进行这种转换?

答案 2 :(得分:0)

由于您在问题中标记为C++,我将在C++

上回答此问题

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

回到你的代码:

#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();
}