2012-11-15 48 views
0

我有一段時間沒有碰過C++,希望有人能指出問題出在我的類定義中。我不斷收到一個錯誤,說「錯誤:'IPsource'沒有命名一個類型」。C++類初始化語法和錯誤「不命名類型」

class AddressPacket { 
    std::string address; 
    int packets; 

    public: 
    void initialize(std::string add) { 
     address = add; 
     packets = 1; 
    } 
    std::string getAddress() { 
     return address; 
    } 
    int getPackets() { 
     return packets; 
    } 
    bool checkAddress(std::string add) { 
     return address == add; 
    } 
    void addPacket() { 
     packets++; 
    } 
}; 

class AddressPacketList { 
    AddressPacket masterList[100]; 
    int listCounter; 

    public: 
    AddressPacketList() { listCounter = 0; } 
    void add(std::string add) { 
     masterList[listCounter].initialize(add); 
     listCounter++; 
    } 
}; 

然後裏面主要我有...

AddressPacketList IPsource(); 
IPsource.add("Hello"); 
+0

您包含哪些文件? – RonaldBarzell

+0

這是[最煩人的解析](http://en.wikipedia.org/wiki/Most_vexing_parse)。 –

回答

4

這並不意味着你認爲它的意思是:

AddressPacketList IPsource(); 

你認爲它聲明瞭一個名爲的IPsource對象鍵入AddressPacketList並使用AddressPacketList的默認構造函數初始化它。

它什麼其實是一個函數聲明。您正在聲明一個名爲IPsource的函數,該函數不接受參數並按值返回AddressPacketList對象。

這個看似奇怪的結論是所謂most vexing parse的結果。

簡單地改變行:

AddressPacketList IPsource; 
+0

刪除括號仍然會導致「不命名類型」錯誤。 – Takkun

+1

@Takkun:你確定錯誤是完全一樣的嗎?請發佈新錯誤。另外,你是否包含了所有需要的東西? –

+0

這是相同的「錯誤:'IPsource'沒有命名一個類型」。我正在定義與主函數相同的類中的類。 – Takkun

0

試試這個:只有當你聲明一個變量要使用非默認的構造函數初始化它

AddressPacketList IPsource; 

,你被允許使用括號。如果你有這樣的構造:

AddressPacketList(std::string packet) { 
    masterList[0].initialize(packet); 
    listCounter = 1; 
} 

然後,你可以聲明局部變量是這樣的:

AddressPacketList IPsource("ABC"); 
1

那麼,您聲明瞭一個名爲IPSource函數,它返回一個AddressPacketList

AddressPacketList IPsource(); // parsed as function declaration 

然後您嘗試將其用作對象。您可以通過更改聲明來修復它

AddressPacketList IPsource;