2013-06-21 159 views
-4

我試圖創建一個可以是任何類型的對象。下面的代碼:從'float'類型轉換爲'float *'類型無效

#include <stdio.h> 

class thing 
{ 
public: 
    void *p; 
    char type; 

    thing(const char* x) 
    { 
     p=(char*)x; 
     type=0; 
    } 

    thing(int x) 
    { 
     p=(int*)x; 
     type=1; 
    } 

    thing(bool x) 
    { 
     p=(bool*)x; 
     type=2; 
    } 

    /* 
    thing(float x) 
    { 
     p=(float*)x; 
     type=3; 
    } 
    */ 

    void print() 
    { 
     switch(type) 
     { 
     case 0: 
      printf("%s\n", p); 
      break; 
     case 1: 
      printf("%i\n", p); 
      break; 
     case 2: 
      if(p>0) 
       printf("true\n"); 
      else 
       printf("false\n"); 
      break; 
     case 3: 
      printf("%f\n", p); 
      break; 
     default: 
      break; 
     } 
    } 
}; 

int main() 
{ 
    thing t0("Hello!"); 
    thing t1(123); 
    thing t2(false); 

    t0.print(); 
    t1.print(); 
    t2.print(); 

    return 0; 
} 

代碼工作,當我運行程序,它會顯示:

Hello! 
123 
false 

但是,如果我去掉浮構造函數,編譯寫入以下錯誤:

main.cpp: In constructor 'thing :: thing (float)': main.cpp: 30:13: 
error: invalid cast from type 'float' to type 'float *' 

爲什麼它不適用於浮動類型? 我使用:Windows XP SP3,MinGW GCC 4.7.2。

+4

爲什麼不使用'boost :: any'? – chris

+0

您是否想要將您正在投射的值的地址存儲到指針?您不能將浮點值存儲爲指針。 –

+1

'p =(float *)x';你正在將一個浮點數轉換爲浮點數*。 –

回答

2

你不應該從隨機類型轉換爲指針類型。即使鑄造char const *,intbool看起來對你有用,但它們不再是你想要的東西,而是將其浮在指針上。事實上,您應該查看C++中的任何強制轉換,作爲警告信號,表明您可能做錯了某些事情。

相反,你應該做下面的事情。

class thing { 
private: 
    union { 
    char const *cs; 
    int i; 
    bool b; 
    float f; 
    }; 
    enum class type { cs, i, b, f } stored_type; 

public: 

    thing(const char* x) : cs(x), stored_type(type::cs) {} 
    thing(int x)   : i(x), stored_type(type:: i) {} 
    thing(bool x)  : b(x), stored_type(type:: b) {} 
    thing(float x)  : f(x), stored_type(type:: f) {} 

    void print() 
    { 
    switch(stored_type) 
    { 
    case type::cs: 
     std::printf("%s\n", cs); break; 
    case type::i: 
     std::printf("%i\n", i); break; 
    case type::b: 
     std::printf("%s\n", b ? "true" : "false"); break; 
    case type::f: 
     std::printf("%f\n", f); break; 
    } 
    } 
}; 

或者更好的是,你可以使用已經爲你做了這樣的庫,例如boost :: variant或boost :: any。

+1

它的工作原理!非常感謝你。 – mrsimb

相關問題