2012-09-26 142 views
0

我想創建一個包含'X'類型數組的'T'類型的動態數組。爲了從X訪問的T屬性,我試圖創造一個指向T.結構X的指針這是我的代碼有:無法將類型轉換爲類型* - C++編譯錯誤

struct WireSeg; // Forward declaration 

struct Track { // Type X in above description 
    int trackNum; 
    bool used; 
    WireSeg* parentWireSeg; 
}; 

struct WireSeg { // Type T in above description 
    int xCoord; 
    int yCoord; 
    char flag; 
    char orientation; 
    Track* track; 
}; 

typedef WireSeg* WireSegPtr 

int main (void) { 
    WireSegPtr wireSeg; 
    wireSeg = new WireSeg[5]; 
    for (int i =0; i<5; i++) { 
    wireSeg[i].track = new Track[3]; 
    for (int j =0; j<3; j++) { 
     wireSeg[i].track[j].parentWireSeg = wireSeg[i]; 
    } 
    } 
} 

我得到的編譯錯誤:

error: cannot convert ‘WireSeg’ to ‘WireSeg*’ in assignment

我不明白。 parentWireSeg已被聲明爲WireSeg類型指針,而wireSeg[i]也是wireSeg數組中的一個元素,並且是一個指針(不是嗎?)。

我試圖玩弄它,並宣佈parentWireSegWireSeg類型:

struct Track { 
    int trackNum; 
    bool used; 
    bool flag; 
    WireSeg parentWireSeg; 
}; 

這給了我錯誤:

‘struct Track’ has no member named ‘parentWireSeg’.

這是沒有意義的,我要麼因爲結構Track確實有parentWireSeg作爲一個元素!有人可以解釋這個嗎?我不允許在Track指向WireSeg

我可以使用繼承類(可以嗎?),但我寧願如果有人告訴我我的方法有什麼問題?

+0

難道你錯過了'typedef WireSeg * WireSegPtr'這行的分號嗎?這將如何編譯? –

+0

我認爲這只是一個錯字,因爲添加分號給了我們'無法轉換'的錯誤。 – Derek

+0

請將您正在使用的實際代碼與剪貼粘貼,而不是拼寫錯誤。 –

回答

2

嘗試改變你做的分配到該行:

wireSeg[i].track[j].parentWireSeg = &wireSeg[i]; 

你看,wireSeg是WireSeg*型的,所以當你取消對它的引用做*wireSegwireSeg[0]wireSeg[i],你得到的東西,是的鍵入WireSeg。如果你想要對象的地址而不是對象本身,所以你可以製作一個指針,你需要添加地址運算符(&)。

+0

Oo,我想我的誤解是我認爲wireSeg [i]是WireSeg類型的指針。我現在看到我的錯誤。謝謝大衛。 – noobuntu

+1

@noobuntu:思考'wireSeg [i]'的一種方式是'*(wireSeg + i)'。 '*'運算符當然是取消引用一個指針,所以我們可以看到'wireSeg [i]'的結果不是一個指針(而是一個完整的對象),'wireSeg + i'的結果是一個指針。 – Cornstalks

0

wireSeg[i] is also an element in the wireSeg array and is a pointer (isn't it?).

沒有,wireSeg[i]是一個wireSeg,而不是一個指針wireSeg

舉例來說,如果你有一個int foo[4] = {1, 2, 3, 4},然後foo[0]將是一個int,而不是int *,對不對?

你需要&wireSeg[i]來得到一個指針;或者只是wireSeg + i,因爲wireSeg可以作爲指針對待,並且添加i與獲取元素i的地址是一樣的。

相關問題