2010-09-23 6 views
0

Je suis un programmeur assez expérimenté mais je suis en train de plonger en C++ et c'est ... bien plus difficile que PHP et Python. Je continue d'avoir des erreurs externes non résolues lorsque je tente de créer un objet à partir de certaines classes. Il est divisé en plusieurs en-têtes et les fichiers, mais voici une idée de base d'un de mes cours:Erreurs "Unresolved External Symbol" lors de la création d'un objet en C++

die.h:

#ifndef DIE_H 
#define DIE_H 

using namespace std; 

class Die { 
public: 
    int throwDie(); 
    Die(); 
}; 

#endif 

die.cpp

#include <iostream> 
#include <cstdlib> 
#include "Die.h" 

using namespace std; 

int Die::throwDie() 
{ 
return 0; 
} 

sixsidedie.h

#ifndef SIXSIDEDIE_H 
#define SIXSIDEDIE_H 

#include "Die.h" 

using namespace std; 

class SixSideDie : public Die 
{ 
public: 
    SixSideDie(); 
    int throwDie(); 

private: 
     int randNumber; 
}; 

#endif 

sixsidedie.cpp

#include <iostream> 
#include <cstdlib> 
#include <time.h> 
#include "Die.h" 
#include "SixSideDie.h" 

using namespace std; 

const int SIX_SIDE = 6; 

int SixSideDie::throwDie() 
{ 
srand((unsigned int)time(0)); 
SixSideDie::randNumber = rand() % SIX_SIDE + 1; 
return SixSideDie::randNumber; 
} 

main.cpp

#include <iostream> 
#include <cstdlib> 
#include "Die.h" 
#include "SixSideDie.h" 
#include "TenSideDie.h" 
#include "TwentySideDie.h" 

using namespace std; 

int main() 
{ 
Die* myDice[3]; 
myDice[0] = new SixSideDie(); 
myDice[1] = new TenSideDie(); 
myDice[2] = new TwentySideDie(); 

myDice[0]->throwDie(); 
myDice[1]->throwDie(); 
myDice[2]->throwDie(); 

system("pause"); 
return 0; 
} 

Il continue à me dire que chaque objet que je crée directement au-dessus est un symbole externe non résolu et je ne sais pas Pourquoi. Des pensées!?

+0

Désolé pour le #include vers le haut. Apparemment, cela les a filtrés, mais je pense qu'ils sont sans conséquence de toute façon. – mpoplin

+0

J'ai compris! J'ai oublié de faire des constructeurs. Que je suis bête. Merci pour l'aide rapide les gars, vous êtes simplement le meilleur. J'espère pouvoir contribuer moi-même bientôt. – mpoplin

Répondre

5

Vous avez déclaré un constructeur pour Die mais vous ne l'avez jamais défini. De plus, vous voulez presque throwDie être virtuel si vous avez l'intention de surcharger son comportement dans les classes dérivées, et vous ne devriez jamais utiliser using namespace std; dans un fichier d'en-tête (et beaucoup de gens, y compris moi, diraient que vous ne devriez pas utilisez-le à file-scope du tout).

+0

+1, bonne prise ... ':)' –

+0

Vous avez raison sur le virtuel! C'est en fait la prochaine étape du laboratoire, mais je dois d'abord compiler le programme. Je vais essayer cela et rendre compte. L'héritage est toujours un peu ahurissant pour moi! : D – mpoplin

+0

Eh bien, vous étiez tous 100% correct mais je vais vous donner des accessoires sur le conseil de l'espace de noms. Je suis sûr que cela m'aurait coûté quelques points demain! – mpoplin

1

Vous n'avez pas défini votre constructeur dans vos fichiers cpp.

1

Il est recommandé de définir les constructeurs des classes. Vérifiez cela:

#ifndef DIE_H 
#define DIE_H 

using namespace std; 

class Die { 
public: 
    int throwDie(); 
    Die() { }; // can you spot the difference here? 
}; 

#endif 
+1

Ou ne déclarez pas explicitement un constructeur si vous n'en avez pas besoin. –

+0

@McNellis en effet. – karlphillip

+1

Juste un heads-up: Si vous utilisez le @ nom, il doit être les premiers caractères du nom de l'utilisateur, sinon l'utilisateur ne recevra pas de notification. –