嗨伙计们!
我有一个问题: -
如果我有一个无效指针" 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;
}
答案 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
,它可以满足您的所有需求,可以随时使用并且已经过测试。