2015-04-23 2 views
0

J'essaie de pratiquer un peu de codage pendant mon temps libre (en combinant un certain nombre d'intérêts différents pour aider à rester engagé) et j'ai rencontré une erreur étrange que je peux ne trouve pas la réponse à. J'ai 4 fichiers avec lesquels je travaille, deux fichiers d'en-tête, un fichier de définition de classe et un fichier principal. Je suis assez confiant que je n'inclue pas le fichier Dice.h plus d'une fois (mais c'est là où l'erreur pointe vers et je ne suis plus sûr, d'où cette question). Qu'est-ce que j'ai bousillé ici pour produire ces erreurs?Définitions multiples en C++ (Visual Basic 2010)

Les codes d'erreur

Erreur 3 erreur LNK1169: un ou plusieurs symboles définis multiplier résultat (chemin de fichier garnis)

d'erreur 2 Erreur LNK2005: "dés int __cdecl (int, int)" (? dice @@ YAHHH @ Z) déjà défini dans Creature.obj (chemin de fichier coupé)

Le chemin de fichier: c: \ Utilisateurs \ Nom d'utilisateur \ documents \ visual studio2010 \ Projects \ RPGTest \ RPGTest \ RPGTest. (erreur 3 référencée un fichier .exe, erreur 2 référencé un fichier .obj).

Le code lui-même:

Dice.h

#ifndef SET_DICE_H_ 
#define SET_DICE_H_ 

#include <iomanip> 
#include <iostream> 
#include <stdlib.h> 

using namespace std; 

int dice(int number, int sides){ 

int total=0, dice; 
srand(time(NULL)); 
int results=0; 
do { 
    dice = rand()%sides+1; 
    total+=dice; 
    number--; 
} while (number > 0); 
results = total; 
return results; 
} 
#endif 

Creature.h

#ifndef CREATURE_H_ 
#define CREATURE_H_ 

#include <iomanip> 
#include <iostream> 
#include "Dice.h" 
using namespace std; 

class Creature { 
public: 
    Creature(int,int,int,int,int,int,int,int,int,int,int,int); 
    void set_hp(); 
    void set_saves(); 
    void set_ac(); 
    void set_bab(); 
    void set_name(); 
    void update_hp(int); 
    void update_ac(int); 
    void update_fsave(int); 
    void update_rsave(int); 
    void update_wsave(int); 
    int get_ac(); 
    int get_hp(); 
    int get_fsave(); 
    int get_rsave(); 
    int get_wsave(); 
    int get_bonus(int); 
    int get_bab(); 
    string get_name(); 
private: 
    int strength, dexterity, constitution, intellegence, wisdom, charisma; 
    int bab, fbsave, rbsave, wbsave; 
    int hdnum, hdsize; 
    int hp, fsave, rsave, wsave, ac; 
    string name; 

}; 
#endif 

Creature.cpp

#include "Creature.h" 
#include <math.h> 
#include <iostream> 

using namespace std; 

Creature::Creature(int strength,int dexterity,int constitution, 
    int intellegence,int wisdom,int charisma,int bab,int fbsave, 
    int rbsave,int wbsave,int hdnum,int hdsize){ 
     strength = strength; 
     dexterity = dexterity; 
     constitution = constitution; 
     intellegence = intellegence; 
     wisdom = wisdom; 
     charisma = charisma; 
     bab = bab; 
     fbsave = fbsave; 
     rbsave = rbsave; 
     wbsave = wbsave; 
     hdnum = hdnum; 
     hdsize = hdsize; 
} 

int Creature::get_bonus(int stat){ 
    int bonus = floor((double(stat)-10)/2); 
    return bonus; 
} 

void Creature::set_ac(){ 
    ac=10+get_bonus(dexterity); 
} 

void Creature::set_hp(){ 
    hp = dice(hdnum,hdsize) + get_bonus(constitution)*hdnum; 
} 

void Creature::set_saves(){ 
    fsave = fbsave + get_bonus(constitution); 
    rsave = rbsave + get_bonus(dexterity); 
    wsave = wbsave + get_bonus(wisdom); 
} 

void Creature::set_bab(){ 
    bab = hdnum; 
} 

void Creature::set_name(){ 
    cout << "Please enter a name for this creature: "; 
    cout << "\nSorry! I don't work yet!"; 
    cout << "\nInstead all creatures are named Larry!\n"; 
    name = "Larry!"; 
} 

void Creature::update_hp(int input){ 
    hp = hp + input; 
} 

void Creature::update_fsave(int input){ 
    fsave = fsave+input; 
} 

void Creature::update_rsave(int input){ 
    rsave = rsave+input; 
} 

void Creature::update_wsave(int input){ 
    wsave = wsave+input; 
} 

void Creature::update_ac(int input){ 
    ac = ac+input; 
} 

int Creature::get_ac(){ 
    return ac; 
} 

int Creature::get_hp(){ 
    return hp; 
} 

int Creature::get_fsave(){ 
    return fsave; 
} 

int Creature::get_rsave(){ 
    return rsave; 
} 

int Creature::get_wsave(){ 
    return wsave; 
} 

int Creature::get_bab(){ 
    return bab; 
} 

RPGTest Cpp

#include "Creature.h" 
#include <math.h> 
//#include "Dice.h" 
#include <iostream> 
#include <iomanip> 

using namespace std; 

int main(){ 

    int str = dice(3,6), dex = dice(3,6), con = dice(3,6), intel = dice(3,6), wis = dice(3,6), cha = dice(3,6); 
    int fbs = dice(1,6), rbs = dice(1,6), wbs = dice(1,6); 
    int hdn = dice(1,10), hds = 8, bab = dice(1,8); 

    cout << "Welcome to RPG Creature Tester v0.1\n"; 
    cout << "This .exe file is meant to test the creature class functions and definitions.\n"; 
    cout << "This will be done by randomly generating and displaying a creature.\n"; 
    cout << "What you don't see right now is the random generation of a creature.\n"; 
    cout << "Once it's finished, the \'statsheet\' will be shown.\n"; 
    cout << "Cheers!\n\n"; 

    Creature potato (str, dex, con, intel, wis, cha, bab, fbs, rbs, wbs, hdn, hds); 

    potato.set_ac(); 
    potato.set_hp(); 
    potato.set_name(); 
    potato.set_saves(); 

    cout << "OUTPUT BRICK YAY\n"; 
    cout << "Str: " << str << endl; 
    cout << "HP: " << potato.get_hp() << " AC: " << potato.get_ac() << " Fort/Reflex/Will Save: " << potato.get_fsave() << "/" << potato.get_rsave() << "/" << potato.get_wsave(); 

    return 0; 
} 

Depuis que je suis principalement autodidacte, je suis heureux pour tout autre conseil, mais mon principal problème est que je ne sais pas pourquoi je reçois l'erreur de définition de « multiples ». J'ai fait quelques recherches sur d'autres questions avec des messages d'erreur similaires mais je n'ai rien vu qui m'ait immédiatement fait penser à "la réponse".

Merci à tous!

Répondre

3

C++ fonctionne en compilant des unités de traduction uniques et en les reliant entre elles.

Cela signifie que chaque fichier source est compilé seul. Étant donné que la directive #include insère essentiellement tout le code inclus, dans votre situation, vous finissez par avoir plusieurs unités de traduction qui définissent

int dice(int number, int sides) { 
    ... 
} 

Compilation passe par bien mais, lors de la liaison, la définition multiple de cette fonction se trouvent donc cela génère la Erreur.

Pour résoudre ce problème, vous avez deux façons:

  • déclarer int dice(int, int) dans un fichier d'en-tête, mais définir (mettre en œuvre) dans un fichier source
  • maintenir la définition telle qu'elle est préfixer mais static à elle. Cela indique au compilateur que chaque unité de traduction obtiendra sa propre méthode dice.Cette solution, bien que tentante, conduit à une augmentation de taille binaire puisque vous aurez plusieurs implémentations de la même méthode
+0

static? Est-ce que 'inline' ne serait pas aussi une (meilleure) solution? Honnêtement, je ne savais même pas que les travaux statiques sur les fonctions. –