2010-10-03 130 views
0

我聲明我的結構對象在我的類中的私有,我初始化他們使用的構造函數,但我的風格檢查說我的結構類型的成員函數不被初始化。在這方面,任何人都可以幫助我,我會非常感謝你。初始化結構對象++

下面是我的代碼,請提出一些解決這個問題

class Datastructure{ 

    //forward decleration 
    struct Ship; 

public: 

    //Constructor DS class 
    Datastructure(); 

//Destructor DS class 
    ~Datastructure(); 



private: 

    struct Ship{ 
    std::string s_class; 
    std::string name; 
    unsigned int length; 
    Ship(); 
    Ship(const std::string& shipClass, const std::string& shipName, 
      unsigned int len); 
    }; 

    Ship minShip; 
    Ship maxShip; 
    std::vector<Ship> shipVector; 
}; 

#endif 

它給我下面的警告

CIMP, line 17: Uninitialized member variables in class 'Datastructure'. 
    FSCH, line 17: No access specifiers at the beginning of class 
       'Datastructure'. 
    IVAP, line 62: Field 'minShip' in class 'Datastructure' is not initialized. 
    IVAP, line 63: Field 'maxShip' in class 'Datastructure' is not initialized. 
    IVAP, line 64: Field 'shipVector' in class 'Datastructure' is not 
       initialized. 
+0

哪個編譯器正在使用哪些編譯器選項?這些看起來像警告。你能運行你的代碼嗎? – 2010-10-03 15:54:57

+0

您使用的是什麼樣式的檢查器? 'Ship'和'std :: vector'都具有用戶聲明(對於用戶的適當定義)構造函數,所以它們的任何實例都不可能保持未初始化。 – 2010-10-03 15:56:16

回答

0

的成員變量, minShipmaxShip,需要 初始化在DataStructure構造函數中。例如,

DataStructure() : minShip(), maxShip(), shipVector() {} 

儘管它不是不正確,否則,最好是提供Ship構造(多個)以便length被初始化到的實施方式公知的(而不是一個隨機的)值。

Ship() : length() {} 

上述語法是相同

Ship() : length(0) {} 

因爲

int i = int(); 

i初始化到0

+0

爲什麼? 'Ship'和'std :: vector'都具有用戶聲明的構造函數,所以_value-initialization_與它們將以其他方式接收的_default-initialization_具有完全相同的效果。 – 2010-10-03 15:59:59

+0

爲什麼需要顯式調用默認ctors?如果你沒有**另外指定(在這種情況下編譯器生成的很好),默認的ctor就是使用的。如果OP沒有定義一些函數,他會聲明他會得到一個鏈接器錯誤,而不是編譯器警告! – 2010-10-03 16:01:33

+0

也許我錯了,我被「警告」帶走了。我會回來,並可能刪除響應。 – Arun 2010-10-03 16:06:36

0

由C++標準,minShip,maxShip和shipVector一直在使用它們的默認構造函數初始化。

但是,您表示您正在使用樣式檢查器。您的樣式指南可能需要顯式調用默認構造函數。這樣做的一個原因是確保您調用正確的構造函數,而不依賴於自動行爲 - 這不是標準要求甚至典型的C++程序員所做的,但如果這是您的樣式,並且您的樣式檢查器將其標記,你可能只需要遵守。

有在那些沒有必要的編譯器不同的地方組織各種樣式規則,但或許讓開發者更容易瞭解對方的代碼。

+0

我正在使用我的大學風格檢查,這是tutg ++風格檢查...實際上,我必須提交任務,併爲此我需要100%的風格,現在是84%。所以任何其他有價值的想法將不勝感激 – 2010-10-03 17:54:22

+0

@ user226161:如果您的大學風格檢查器要求您顯式初始化所有成員變量(不依賴於語言默認值),則無法繞過它。即使編譯器生成的初始化過程完全相同,您也必須編寫明確的初始化代碼。 – 2010-10-04 13:27:22