2014-09-22 1 views
0

привет, ребята!Как напечатать значение, которое указатель в классе указывает на

У меня есть вопрос, пожалуйста: -

, если у меня есть указатель недействительным «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

Если вы хотите распечатать значение указателя (т.е. адрес), просто используйте putIN.vb.

Если вы хотите напечатать значение, то указатель POINTS TO, то вы должны знать, какой тип (используйте, например, броски, как в конструкторе). Но вы храните информацию о типе где-то, чтобы вы можно вспомнить позже, что вы сделали магазин?

Кстати, ваши delete заявления будут Segfault, потому что вы пытаетесь удалить указатель, который не был получен с помощью 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'; } 

Имея это в виду, вы могли бы перегрузить оператор < <

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, который обеспечивает все ваши потребности, готовые к использованию и уже испытанные.

+0

спасибо за помощь я хочу, чтобы напечатать значение, что точка указателя на я не хранимую в информацию о типе в любом месте и я не имею ни малейшего представления о том, как сделать это Пожалуйста, вы можете дать мне ссылку учебника – AXR

+1

@AlexanderHB: Если вы хотите напечатать значение объекта, на которое он указывает, вы можете обновить заголовок своего вопроса. В настоящее время он просит о печати значения самого указателя. –

+0

@Christophe: tyvm я попробую ваш код Я пытаюсь создать класс, который может выделить память для всех типов данных например putIN x = 5 будет выделять память для целого putIN y = 0.5 будет выделять память для float putIN z = 'a' выделяет память для char и т. д. – AXR