2011-10-31 52 views
14

我有一個C++程序:C++。錯誤:無效不是一個指針到對象類型

struct arguments 
{ 
    int a, b, c; 
    arguments(): a(3), b(6), c(9) {} 
}; 

class test_class{ 
    public: 

    void *member_func(void *args){ 
     arguments vars = (arguments *) (*args); //error: void is not a 
               //pointer-to-object type 

     std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n"; 
    } 
}; 

在編譯它拋出一個錯誤:

error: ‘void*’ is not a pointer-to-object type 

有人能解釋我在做什麼錯產生這個錯誤?

+0

是的,有。你有沒有嘗試給'args'另一個數據類型? – Blender

+2

在這個例子中,你沒有任何「抽象類型」(我假設你是指抽象基類)。你可能的意思是'*(arguments *)args',它將'args'從'void *'轉換爲'arguments *',然後_dereference它。你當前的代碼試圖解引用一個'void *'(這是非法的),然後將解引用的值轉換爲'arguments *',這幾乎肯定不是你想要的。 –

+0

@Chris是的,這是我想要做的,謝謝澄清。順便說一句,我認爲結構和類被認爲是抽象類型,例如。 int,float是非抽象的。 –

回答

17

您提領該void * - (如在評論中提到這也避免了拷貝構造函數): 試試這個:或者

arguments vars = *(arguments *) (args); 
std::cout << "\n" << vars.a << "\t" << vars.b << "\t" << vars.c << "\n"; 

,你可以這樣做一個具體類型。你需要做的周圍用另一種方式:

arguments vars = *(arguments *) (args); 

這個順序很重要,因爲編譯器不知道如何申請*args(這是一個void *且無法解除引用)。你的(arguments *)告訴它該做什麼,但已經太晚了,因爲已經發生了解除引用。

+1

但是請在這裏使用'static_cast' - 你會得到一個更好的錯誤信息... –

+0

@比利'static_cast'做什麼? –

+1

@Matt:和C風格演員一樣,除了更多的限制。 'static_cast'不允許刪除'const',重新解釋一個指針類型以及其他一些令人討厭的東西。一般來說,任何static_cast都可以在平臺/體系結構上運行。有關更多詳細信息,請參閱C++標準的5.2.9節(假設C++ 03) –

3

你有錯誤的地方*。所以你試着去引用void*。它鑄造之前

arguments *vars = (arguments *) (args); 
std::cout << "\n" << vars->a << "\t" << vars->b << "\t" << vars->c << "\n"; 
+0

將它作爲指針可能會更好,因爲它避免了複製構造函數。但是,OP應該使指針('arguments *'和'void *')'const'。 –

0

* args表示「對象(值)參數指向」。因此,它不能作爲指向對象(參數)的指針。這就是爲什麼它是給錯誤

4

裸露的骨頭例如重現上述錯誤:

#include <iostream> 
using namespace std; 
int main() { 
    int myint = 9;    //good 
    void *pointer_to_void;  //good 
    pointer_to_void = &myint; //good 

    cout << *pointer_to_void; //error: 'void*' is not a pointer-to-object type 
} 

上面的代碼是錯誤的,因爲它試圖取消引用指針無效。這是不允許的。

現在運行下面的代碼,如果你明白爲什麼下面的代碼運行並且上面的代碼沒有運行,那麼你將會更好地理解底層的情況。

#include <iostream> 
using namespace std; 
int main() { 
    int myint = 9; 
    void *pointer_to_void; 
    int *pointer_to_int; 
    pointer_to_void = &myint; 
    pointer_to_int = (int *) pointer_to_void; 

    cout << *pointer_to_int; //prints '9' 
    return 0; 
} 
0

bdonlan說的問題是「在鑄造之前取消引用void*」。

我覺得這個例子會有所幫助:

#include <iostream> 

using namespace std; 

int main() 
{ 



    void *sad; 
    int s = 23; 
    float d = 5.8; 

    sad = &s; 
    cout << *(int*) sad;//outputs 23//wrong: cout << *sad ;//wrong: cout << (int*) *sad; 



    sad = &d; 
    cout << *(float *) sad;//outputs 5.8//wrong: cout << *sad ;//wrong: cout << (float*) *sad; 

    return 0; 
} 
相關問題