【问题标题】:How to access class members using void pointer(generic) in c++如何在 C++ 中使用 void 指针(通用)访问类成员
【发布时间】:2014-06-13 04:18:14
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

您需要在每次使用 void 指针时声明您希望如何处理它。 做到这一点的方法是铸造 (car*)p

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

system("pause");

【讨论】:

  • 在 C++ 中避免 C 风格的强制转换!
  • 请不要给出带有 c-style casts 的 c++ 示例。它们是一种糟糕的编码风格选择(很难在代码中找到、不安全、不可扩展,并且它们引入的代码在数据类型更改时会默默地失败)。
【解决方案2】:

很奇怪,你知道,当你声明一个 void* 的数据时,数据没有类型信息,那
表示你不知道数据的内容,可能是汽车,也可能是后备箱,浮动,int ... 那么为什么要进行这种转换呢?

【讨论】:

    【解决方案3】:

    由于您在问题中标记了C++,我将在C++ 上回答这个问题

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

    回到你的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多