2010-10-03 5 views
0

Je déclare mon objet struct dans ma classe private et je les initialise en utilisant des constructeurs mais mon vérificateur de style dit que la fonction membre de mon type struct n'est pas initialisée. Quelqu'un peut-il m'aider à cet égard, je serai très reconnaissant envers vous.initialise l'objet struct déclaré dans la classe private en C++

Ci-dessous est mon code s'il vous plaît suggérer une solution à ce problème

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 

il me donne les avertissements suivants

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

Quels compilateurs utilisent et quelles sont les options du compilateur? Ils ressemblent à des avertissements. Pouvez-vous exécuter votre code? –

+0

Quel vérificateur de style utilisez-vous? 'Ship' et' std :: vector' ont tous les deux des constructeurs déclarés par l'utilisateur (pour une définition appropriée de l'utilisateur), donc il n'est pas possible que des instances de ceux-ci soient laissées non initialisées. –

Répondre

0

Les variables membres, minShip et maxShip, doit initialisé dans le constructeur DataStructure. Par exemple,

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

Bien qu'il soit incorrect sinon, il est préférable de fournir des implémentations du constructeur Ship (s) de telle sorte que length obtient initialisés à une connue (par opposition à un aléatoire) valeur.

Ship() : length() {} 

La syntaxe ci-dessus est le même que

Ship() : length(0) {} 

parce

int i = int(); 

i-0 initialise.

+0

Pourquoi? 'Ship' et' std :: vector' ont tous les deux des constructeurs déclarés par l'utilisateur donc _value-initialization_ a exactement le même effet que _default-initialization_ qu'ils recevraient autrement. –

+0

Pourquoi l'appel explicite des processeurs par défaut serait-il nécessaire? Le ctor par défaut est ce qui est utilisé si vous ** ne spécifiez pas le contraire (et dans ce cas, ceux qui sont générés par le compilateur sont bien). Si l'OP ne définit pas certaines fonctions, il déclare qu'il obtiendrait une erreur de l'éditeur de liens, pas des avertissements du compilateur! –

+0

Probablement je me trompe, j'ai été emporté par les "avertissements". Je vais revenir, et éventuellement supprimer la réponse. – Arun

0

Par la norme C++, minShip, maxShip et shipVector ont été initialisés en utilisant leurs constructeurs par défaut.

Toutefois, vous avez indiqué que vous utilisez un vérificateur de style. Votre guide de style peut nécessiter des appels explicites au constructeur par défaut. Une raison à cela est de vous assurer que vous appelez le bon constructeur et ne vous fiez pas au comportement automatique - ce n'est pas ce que la norme exige ou même les programmeurs C++ typiques, mais si c'est votre style, vous pourriez juste devoir se conformer.

Il existe toutes sortes de règles de style dans différentes organisations qui ne sont pas nécessaires pour le compilateur, mais qui facilitent peut-être la compréhension du code de l'autre.

+0

J'utilise ma vérification de style universitaire qui est tutg ++ vérificateur de style ... en fait je dois soumettre la tâche et pour cela j'ai besoin de style 100% et maintenant il est de 84%. –

+0

@ user226161: Si votre vérificateur de style universitaire exige que vous initialisiez explicitement toutes les variables membres (sans compter sur les valeurs par défaut), alors il n'y a aucun moyen de contourner le problème. Il suffit d'écrire le code d'initialisation explicite, même si l'initialisation générée par le compilateur aurait été identique. –