2010-10-03 224 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