如何在c++中使用void指针(泛型)访问类成员
How to access class members using void pointer(generic) in c++
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();
}
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型枚举和其他类型的重载模板函数
- 使用泛型类型推送到堆栈时出现问题
- 可变参数泛型 lambda 和函数重载
- 泛型突变器/访问器函数
- 在 C++ 中访问泛型结构的成员会出错
- 从一个基类的指针对另一个基类的多重继承和泛型访问
- 从非模板类派生的模板类:访问派生类的泛型变量
- 如何在c++中使用void指针(泛型)访问类成员
- 从派生类中的强制转换泛型指针访问成员会导致访问冲突