2016-02-12 73 views
0

我有一個任務,我必須使用節點的鏈接列表與void *作爲數據。我將用一個對象填充節點。我想知道一些訪問對象成員後,它是否在鏈接列表中的方式,而不是將其轉換爲類。可能嗎?此外,這是我的代碼塊,以防萬一它有助於澄清我的問題。訪問一個對象的成員void pointer C++

struct Node 
{ 
    void* data_; 
    Node* next_; 

    Node() 
    { 
     data_ = 0; 
     next_ = 0; 
    } 
}; 

class Star 
{ 
private: 
    char name_[ENTRY_SZ]; 
    long temperature_; 
    double luminosity_; 
    double mass_; 
    double radius_; 

public: 
    static char filePath_[ENTRY_SZ]; 

    Star(char* name); 
    void SetTemperature(char* temp); 
    void SetLuminosity(char* lum); 
    void SetMass(char* mass); 
    void SetRadius(char* rad); 
    void PrintToConsole(); 
    void AppendToFile(); 
}; 

我希望能夠在void *後調用PrintToConsole函數。

+0

供參考 - 你不需要一個鏈表來問這個問題。你想要一個空指針並將其轉化爲具體的東西。如果不是'Star'類型是一個簡單的'int'或'double',答案基本上是一樣的。 – PaulMcKenzie

回答

1

如果沒有先投射它,則無法使用void*的指針。如果指向在Star,例如,你可以做這樣的事情:

static_cast<Star*>(data_)->PrintToConsole(); // Haha, Star star! 

這就是說,在C++中,這是非常不尋常存儲這樣的事情。使用模板類會更好,因此您可以獲取所需的類型信息。

+0

也許他們還沒有研究過模板。 – Barmar

+0

@Barmar幾乎可以肯定是這種情況。儘管如此,我仍然認爲應該提及它們,這樣他們才知道它們存在。 – templatetypedef

+0

謝謝,我不知道是否有更好的方法來做到這一點,而不是套管。 – spartin503

0

你應該將它施放到課堂上。但是,如果你真的不想要,你可以使用offsetof宏:

宏offsetof擴展到類型的std ::爲size_t的一個常量, 值的偏移量,其中,以字節爲單位,從指定類型的 對象到其指定成員的開始,包括填充(如果有 任何)。 如果type不是標準佈局類型,則行爲是未定義的。 如果成員是靜態成員或成員函數,則行爲是 未定義。

但是,你應該把它扔到課堂上。

編輯:啊,我看你想訪問類的方法。這是不可能的。你應該把它投到課堂上。

+0

'offsetof'如何幫助調用對象的PrintToConsole方法? – Barmar

+0

我不明白'offsetof'在這裏會有用。你能詳細說明一下嗎? – templatetypedef

0

不需要。您必須將其轉換爲適當的對象。

我會質疑使用void指針的原因。

我也建議一個動態轉換可能會更好

+0

'dynamic_cast' =設計失敗,只有極少數例外。 – SergeyA

+0

@SergeyA - 我同意 - 但有了這個問題,這是我能想到的最好的事情。 –

0

因爲這是一個任務,你可能是最好問問你的老師/導師,什麼他們的意圖是在C使用void*類型++; void*類型不是固有的不好,但有其他方式來實現類似的結果,同時保持語言的一致性。

直接回答:

我想知道的訪問對象的成員後,它在鏈表,比鑄造類的其他的一些方式。可能嗎?

是的,這是可能的,但不使用void*成語。使用你的代碼作爲一個例子,你確實需要轉型爲適當的類型,並某些的指向的類型兼容,如果你保持void*,例如:

struct Node 
{ 
    void* data_; 
    Node* next_; 

    Node() 
    { 
     data_ = 0; 
     next_ = 0; 
    } 
}; 

class Star 
{ 
    public: 
     void PrintToConsole() {} // empty to avoid not-defined errors 
}; 

int main() { 
    Node n; 
    n.data_ = new int(42); 
    static_cast<Star*>(n.data_)->PrintToConsole(); // this will compile fine, but what happens here is undefined 
    delete static_cast<int*>(n.data_); // can't delete void*, have to cast 
    return 0; 
} 

再次,因爲這是一個分配,你的教授很可能只是想教一下指針和鑄造或類型的系統,你可能還沒有了解C++模板,但既然你問,這裏是你使用的代碼模板:

template < typename T > 
struct Node 
{ 
    T data_; 
    Node* next_; 

    // use member init list to construct default T object 
    Node() : data_(), next_(0) 
    { 
    } 
}; 

class Star 
{ 
    public: 
     void PrintToConsole() {} // empty to avoid not-defined errors 
}; 

int main() { 
    Node<Star*> n; 
    n.data_ = new Star(); 
    n.data_->PrintToConsole(); // OK 
    delete n.data_; // no cast needed since data_ is a Star* type 

    Node<int*> n2; 
    n2.data_ = new Star(); // compiler error (data_ is of type int* not Star*) 
    n2.data_->PrintToConsole(); // compiler error (int has no member named PrintToConsole) 
    delete n.data_; 
    return 0; 
} 

這僅僅是一個一個簡單的例子來說明你在問什麼,它仍然是p如果你對這個話題感到困惑,最好可以問你的老師更多的解釋。

希望能有所幫助。