如何打印类中指针指向的值

时间:2014-09-22 17:17:31

标签: c++ pointers void-pointers

嗨伙计们!

我有一个问题: -

如果我有一个无效指针" vp"并且这个指针是类" cl"的成员。我怎样才能打印指针" vp"指向?提前致谢 这是我的代码:

#include <iostream>
#include<conio.h>



using namespace std;

class putIN
{
  public:
     void *vp;
     int *intP;float *floatP;double *doubleP;
     int valueInt;
     double valueDouble;
     char valueFloat;

     putIN();
     putIN(int x);
     putIN(double x);
     putIN(float x);
     ~putIN()
        { 
          delete intP;
          delete floatP;
          delete doubleP;
        }
 };


putIN::putIN(int x){vp = & valueInt; *((int*)vp) = x;}
putIN::putIN(float x){vp = & valueFloat; *((float*)vp) = x;}
putIN::putIN(double x){vp = & valueDouble; *((double*)vp) = x;}


int main()
{
  putIN x = 5;
  cout<<?????<<endl;// what do i have to put instead of the ??????
                    //to print the value that *vp point to
getch();
return 0;
}

1 个答案:

答案 0 :(得分:1)

如果要打印指针的值(即地址),只需使用putIN.vb即可。

如果你想打印指针POINTS TO的值,那么你必须知道它的类型(例如使用强制类型转换器,就像你在构造函数中所做的那样。但你是否存储了某个类型的信息,以便你可以记得以后你做了什么?

顺便说一句,您的delete语句会出现段错误,因为您尝试删除未通过new获取的指针。

我并不完全明白你想要达到的目标,但你可以用这样的东西来详细说明:

class putIN
{
  public:
     char mytype;   // I for int, F for float, etc... 
     void *vp;
     union {        // as you use only one of them:
         int valueInt;
         double valueDouble;
         float valueFloat;
         } value; 
     ...
 };
 putIN::putIN(int x){vp = &value.valueInt; *((int*)vp) = x; mytype='I'; }

考虑到这一点,您可以重载运算符&lt;&lt;&lt;

ostream& operator<< (ostream& os, putIN p) {
   if (mytype=='I') 
       os << *(int*)vp;
   else // ... the handling of other supported types here
   return os;
}

然后,您只需撰写main()

即可在cout<<x<<endl;中输出结果

另一种选择是创建模板类。

    template <class T>
    class putIN
    {
      public:
         T *vp;
         T value;

         putIN(T x) {vp = &value; *vp = x;}
         ~putIN() {}
     //...
     };

另一种方法是使用boost:variant,它可以满足您的所有需求,可以随时使用并且已经过测试。