2013-07-23 3 views
3

EDITaucune fonction de correspondance pour appel à constructeur (C++)

Ok, je l'ai fait un peu de lecture à nouveau pendant quelques heures et je pense que je comprends enfin C++ POO un peu mieux (au moins bases). J'ai décidé de réécrire l'ensemble du programme et du code un peu à la fois et de tester plus. Je pense que j'ai réduit les erreurs, j'ai un peu plus cette fois.

NamedStorm.h

#include <string> 
#include <iostream> 

#ifndef NAMEDSTORM_H_INCLUDED 
#define NAMEDSTORM_H_INCLUDED 

// NEVER use using namespce in header, use std instead. 

class NamedStorm{ 
private: 
    std::string stormName; 
    std::string stormCategory; 
    double maxWindSpeed; 
    double stormPressure; 
    static int stormCount; 
public: 

    // Constructor 
    NamedStorm(std::string, double, std::string, double); 
    NamedStorm(std::string); 

    // Destructor 
    ~NamedStorm(); 

    // Get functions 
    int getStormCount(); 
    double getStormPressure(); 
    double getWindSpeed(); 
    std::string getStormCategory(); 
    std::string getName(); 

    // Set functions 
    static void displayOutput(); 
    static void sortByNames(); 
    static void sortByWindSpeed(); 
    static void getAverageWindSpeed(); 
    static void getAverageStormPressure(); 
}; 

#endif // NAMEDSTORM_H_INCLUDED 

NamedStorm.cpp

// CPP => Function definition 
#include <string> 

#include "NamedStorm.h" 

using namespace std; 

// Defining static variables 
int NamedStorm::stormCount = 0; 

// Constructor definition 
NamedStorm::NamedStorm(std::string sName, double wSpeed, std::string sCat, double sPress){ 
    stormName = sName; 
    windSpeed = wSpeed; 
    stormCategory = sCat; 
    stormPressure = sPress; 
    stormCount++; 
} 

NamedStorm::NamedStorm(std::string sName){ 
    stormName = sName; 
    stormCount++; 
} 

// Destructor definition 
NamedStorm::~NamedStorm(){} 

// Get (Accessor) function definition 
int NamedStorm::getStormCount(){ 
    return stormCount; 
} 

double NamedStorm::getStormPressure(){ 
    return stormPressure; 
} 

string NamedStorm::getStormCategory(){ 
    return stormCategory; 
} 

string NamedStorm::getName(){ 
    return stormName; 
} 

// Set (Mutator) function definition 
void NamedStorm::displayOutput(){} 
void NamedStorm::sortByNames(){} 
void NamedStorm::getAverageStormPressure(){} 
void NamedStorm::getAverageWindSpeed(){} 
void NamedStorm::getWindSpeed(){} 

main.cpp

#include <iostream> 
#include <string> 

#include "NamedStorm.h" 

using namespace std; 

NamedStorm storm[5]; // Error occurs here 

int main(){ 
    // NamedStorm Chris("Chris", 70.0, "T.S", 990.0); 
    // storm[0] = Chris; 
    return 0; 
} 
+2

Ce 'NamedStorm() {};' n'est pas seulement une déclaration, mais aussi une définition. Faute de frappe? – dyp

+4

Un de vos constructeurs est défini deux fois, un pas du tout, et s'il vous plaît ** jamais ** utiliser 'using namespace blah;' dans un en-tête. – chris

+0

qu'est-ce que vous utilisez pour l'exécuter - assurez-vous que vos fichiers sont tous liés correctement et dans le bon ordre. @DyP il est possible qu'il veuille un constructeur par défaut vide pour une raison quelconque. Mais oui, il est défini deux fois –

Répondre

4

1. Supprimer la définition du constructeur

Dans votre fichier d'en-tête (NamedStorm.h) vous avez défini le constructeur par défaut de NamedStorm:

NamedStorm(){}; 

Mais ce que vous vouliez vraiment est juste le constructeur Déclaration:

NamedStorm(); 

La différence entre defin Ition et déclaration est que la déclaration indique seulement au compilateur qu'il y a une fonction (par exemple: constructeur NamedStorm), alors que la définition fournit le corps complet de cette fonction.

Notez que, si vous spécifiez uniquement la déclaration pour votre fonction et oubliez de créer la définition, vous obtiendrez l'erreur de l'éditeur de liens undefined reference.

Pour en savoir plus: http://www.cprogramming.com/declare_vs_define.html

2. Corrigez le second constructeur

NamedStorm::NamedStorm(string sName, double wSpeed, string sName, double sPress) 

Cela ne peut pas travailler, parce que vous essayez de passer deux arguments avec le même nom. Je suppose que vous vouliez nommer le second sCat, puisque vous utilisez une telle variable dans la définition du constructeur. version correcte:

NamedStorm::NamedStorm(string sName, double wSpeed, string sCat, double sPress) 

3. L'opérateur < <

Si vous lisez la première section, alors vous devez savoir ce qui ne va pas avec le operator<< maintenant. Vous avez fourni uniquement la déclaration , pas la définition.

Vous pouvez le remplir comme ceci:

std::ostream& operator<<(ostream& out, NamedStorm& namedStorm) 
{ 
    out << namedStorm.getName(); 
    return out; 
} 

Notez que la déclaration est également modifiée - la fonction prend maintenant NamedStorm& au lieu de const NamedStorm&, parce que la méthode getName est pas déclarée comme const. Vous pouvez lire environ const méthodes here.

4. Définir les variables statiques CLAS

Chaque variable statique vous déclarez dans votre classe (seulement int stormCount dans votre cas) doivent être définis. Mettez cette ligne dans votre fichier NamedStorm.cpp:

int NamedStorm::stormCount = 0; 

Après avoir appliqué ces modifications de votre code devrait fonctionner correctement. Cependant, il existe encore de nombreuses nuances de langue que vous pourriez lire pour améliorer votre code. Certains d'entre eux sont:

1. Passage des arguments de fonction en tant que valeurs vs référence const

Bonne lecture ici: Is it better in C++ to pass by value or pass by constant reference?

2. Fonctions retour copies objet vs référence const

Cette question a aussi une belle réponse sur SO: Is it more efficient to return a const reference

3. Soyez prudent avec « espace de noms en utilisant »

Encore une fois, SO: Why is "using namespace std" considered bad practice?

Si vous vraiment voulez l'utiliser, jamais l'utiliser dans le fichier d'en-tête, car il aura une incidence sur tous les fichiers qui l'inclut.

+0

+1 Utile, mais incomplet. Les "accesseurs" prenant un 'NamedStorm param []' contiennent toujours des bogues et/ou sont sujettes aux erreurs (en supposant une taille de tableau de 5). – dyp

+0

J'ai décidé de recommencer le code entier, vos solutions aident BEAUCOUP, mais le code a des erreurs à corriger –

+0

@ Tee-Man: pourriez-vous être plus précis? Il ne devrait y avoir aucune erreur de compilateur/éditeur de liens si vous avez suivi les étapes ci-dessus. – podkova

Questions connexes