2009-02-08 7 views
1

Voici la situation:Juste commencé C++: Erreur de symbole non défini sur Compiler

Je viens de commencer ma première classe C++. Je ne connais rien au C++ et bien que ce soit une introduction à la classe C++, le professeur a enseigné à peu près pas de syntaxe pour le langage, juste une logique que nous connaissons déjà.

Maintenant, il nous a donné une description du programme et a dit: "écrivez-le, lol." Je comprends bien la logique, mais comme je l'ai déjà dit, je ne connais rien au C++. Donc je l'ai écrit en java (que je connais), et une fois que je l'ai eu en java, j'ai essayé de le coder en C++.

Mais maintenant, je reçois quelqu'un erreur suivant lorsque je compile

uxb3% g++ -o Race race.cc 
Undefined      first referenced 
symbol        in file 
main        /usr/local/gcc-4.1.1/bin/../lib/gcc/sparc-sun-solaris2.10/4.1.1/crt1.o 
ld: fatal: Symbol referencing errors. No output written to Race 
collect2: ld returned 1 exit status 

peut me aider s'il vous plaît avec cela?

Voici mon code dans un fichier txt: http://rapidshare.com/files/195742284/race.txt.html

et là, il est dans une pâte de copie:

#include <cstdlib> 
#include <ctime> 
#include <iostream> 
#include <string> 

using namespace std; 
class Race 
{ 

     void main() 
     { 
       executeRace(); 
     } 

     int randomMove() 
     { 
       srand(time(NULL)); 
       int randomInt = rand() % 100 + 1; 
       return randomInt; 
     } 

     void executeRace() 
     { 
       int rabbitPosition = 1; 
       int turtlePosition = 1; 

       cout << "BANG!!!" << endl << "AND THEY'RE OFF!!!"; 

       while (rabbitPosition <=70 && turtlePosition <=70) 
       { 
         printPositions(rabbitPosition, turtlePosition); 

         turtlePosition = turtleMoveSquares(turtlePosition); 
         rabbitPosition = rabbitMoveSquares(rabbitPosition); 
       } 

       printWinner(rabbitPosition, turtlePosition); 

       tie(rabbitPosition, turtlePosition); 
     } 

     int turtleMoveSquares(int tPosition) 
     { 

       int turtleMove = randomMove(); 

       if(turtleMove >=1 && turtleMove <= 40) 
         tPosition = tPosition + 4; 

       if(turtleMove >= 41 && turtleMove <= 50) 
         tPosition = tPosition - 2; 

       if(turtleMove >=51 && turtleMove <=100) 
         tPosition = tPosition + 2; 

       if(tPosition < 1) 
         tPosition = 1; 

       return tPosition; 
     } 


     int rabbitMoveSquares(int rabbitPosition) 
     { 

       int rabbitMove = randomMove(); 

       if(rabbitMove >=1 && rabbitMove <= 25) 
         rabbitPosition = rabbitPosition; 

       if(rabbitMove >=26 && rabbitMove <= 55) 
         rabbitPosition = rabbitPosition + 10; 

       if(rabbitMove >=56 && rabbitMove <=60) 
         rabbitPosition = rabbitPosition - 15; 

       if(rabbitMove >=61 && rabbitMove <= 90) 
         rabbitPosition = rabbitPosition + 5; 

       if(rabbitMove >=90 && rabbitMove <=100) 
         rabbitPosition = rabbitPosition - 3; 

       if(rabbitPosition < 1) 
         rabbitPosition = 1; 

       return rabbitPosition; 
     } 

     void printPositions(int rabbitPositions, int turtlePositions) 
     { 
       int turtleCount; 
       int rabbitCount; 
       int endCount; 

       if(rabbitPositions == turtlePositions && rabbitPositions != 1) 
       { 
         turtleCount = 1; 

         while(turtleCount < turtlePositions) 
         { 
           cout << "-"; 
           turtleCount = turtleCount+1; 
         } 
         cout << "OUCH!"; 
       } 

       else 
       { 
         turtleCount = 1; 
         rabbitCount = 1; 
         endCount=1; 

         if(turtlePositions < rabbitPositions) 
         { 
           while(turtleCount < turtlePositions) 
           { 
             cout << "-"; 
               turtleCount = turtleCount+1; 
           } 

           cout << "T"; 

           while(rabbitCount < (rabbitPositions - turtlePositions)) 
           { 
             cout << "-"; 
             rabbitCount = rabbitCount+1; 
           } 
           cout << "H"; 

         } 

         if(rabbitPositions < turtlePositions) 
         { 
           while(rabbitCount < rabbitPositions) 
           { 
             cout << "-"; 
               rabbitCount = rabbitCount+1; 
           } 
           cout << "H"; 

           while(turtleCount < (turtlePositions - rabbitPositions)) 
           { 
             cout << "-"; 
             turtleCount = turtleCount+1; 
           } 
           cout << "T"; 

           cout << "\n"; 
         } 
       } 
     } 

     void printWinner(int rabbitPosition, int turtlePosition) 
     { 
       if(turtlePosition >= 70 && rabbitPosition < 70) 
       { 
         cout << "TORTOISE WINS!!! YAY!!!\n"; 
       } 
       else if(rabbitPosition >=70 && turtlePosition < 70) 
       { 
         cout << "Hare wins. Yuch.\n"; 
       } 
       else if(rabbitPosition >=70 && turtlePosition >=70) 
       { 
         cout << "It's a tie\n"; 
       } 
     } 

     void tie(int turtlePosition, int rabbitPosition) 
     { 
       if(rabbitPosition >=70 && turtlePosition >=70) 
         executeRace(); 
     } 
}; 
+0

Trop de Java, pas assez de C. –

Répondre

14

Il se plaint de main être définie, et il est juste. C et C++ nécessitent une fonction autonome nommée main qui renvoie int. Il ne suffit pas d'avoir une classe avec une méthode nommée main; le compilateur ne se soucie que de lui seul.

Une autre chose à retenir est que la visibilité par défaut pour les membres dans un type class est privée. Modifiez votre classe à utiliser struct - qui est à peu près la seule différence entre les deux - ou spécifier la visibilité publique:

class Race { 
public: 
    void main() { ... } 
}; 

Ensuite, vous pouvez appeler la fonction main de votre classe:

int main() { 
    Race race; 
    race.main(); 
    return EXIT_SUCCESS; 
} 
+0

Belle prise au niveau d'accès par défaut. – Bernard

3

Vous avez besoin une fonction main() pour donner au programme un point de départ:

int main() 
{ 
    // whatever... 
    // Maybe: 

    Race race; 

    race.main(); 
} 

Mais il serait probablement logique d'avoir beaucoup de vos méthodes sont des méthodes statiques puisqu'elles ne s'appuient sur aucun membre de la classe Race.

+0

Si vous allez utiliser des méthodes statiques, j'aurais tendance à utiliser simplement des fonctions. Peut-être dans un espace de noms. – Bernard

+0

Vous n'obtiendrez aucun argument de ma part. –

3

Vous avez besoin d'une fonction principale:

// The arguments are only needed if passing arguments to your program. 
// You could just use `int main()`. 
int main(int argc, char** argv) 
{ 
    Race race; 
    race.executeRace(); 
} 

ou si, sans voir votre erreur spécifique.

3

C++ est vraiment rien comme Java. Par exemple, les fonctions ne doivent pas faire partie d'une classe. Vous devez déplacer la fonction main() pour qu'elle soit en dehors de la classe.

class Race { 
    // stuff 
}; 

int main() { 
    // stuff 
} 
2

Peut-être est ce que vous vouliez dire

#include <cstdlib> 
#include <ctime> 
#include <iostream> 
#include <string> 

using namespace std; 



class Race 
{ 

public: 
    void ExecuteRace() 
    { 
     int rabbitPosition = 1; 
     int turtlePosition = 1; 

     cout << "BANG!!!" << endl << "AND THEY'RE OFF!!!"; 

     while (rabbitPosition <=70 && turtlePosition <=70) 
     { 
      printPositions(rabbitPosition, turtlePosition); 

      turtlePosition = turtleMoveSquares(turtlePosition); 
      rabbitPosition = rabbitMoveSquares(rabbitPosition); 
     } 

     printWinner(rabbitPosition, turtlePosition); 

     tie(rabbitPosition, turtlePosition); 
    } 

private: 
    int randomMove() 
    { 
     srand(time(NULL)); 
     int randomInt = rand() % 100 + 1; 
     return randomInt; 
    } 


    int turtleMoveSquares(int tPosition) 
    { 

     int turtleMove = randomMove(); 

     if(turtleMove >=1 && turtleMove <= 40) 
      tPosition = tPosition + 4; 

     if(turtleMove >= 41 && turtleMove <= 50) 
      tPosition = tPosition - 2; 

     if(turtleMove >=51 && turtleMove <=100) 
      tPosition = tPosition + 2; 

     if(tPosition < 1) 
      tPosition = 1; 

     return tPosition; 
    } 


    int rabbitMoveSquares(int rabbitPosition) 
    { 

     int rabbitMove = randomMove(); 

     if(rabbitMove >=1 && rabbitMove <= 25) 
      rabbitPosition = rabbitPosition; 

     if(rabbitMove >=26 && rabbitMove <= 55) 
      rabbitPosition = rabbitPosition + 10; 

     if(rabbitMove >=56 && rabbitMove <=60) 
      rabbitPosition = rabbitPosition - 15; 

     if(rabbitMove >=61 && rabbitMove <= 90) 
      rabbitPosition = rabbitPosition + 5; 

     if(rabbitMove >=90 && rabbitMove <=100) 
      rabbitPosition = rabbitPosition - 3; 

     if(rabbitPosition < 1) 
      rabbitPosition = 1; 

     return rabbitPosition; 
    } 

    void printPositions(int rabbitPositions, int turtlePositions) 
    { 
     int turtleCount; 
     int rabbitCount; 
     int endCount; 

     if(rabbitPositions == turtlePositions && rabbitPositions != 1) 
     { 
      turtleCount = 1; 

      while(turtleCount < turtlePositions) 
      { 
       cout << "-"; 
       turtleCount = turtleCount+1; 
      } 
      cout << "OUCH!"; 
     } 

     else 
     { 
      turtleCount = 1; 
      rabbitCount = 1; 
      endCount=1; 

      if(turtlePositions < rabbitPositions) 
      { 
       while(turtleCount < turtlePositions) 
       { 
        cout << "-"; 
        turtleCount = turtleCount+1; 
       } 

       cout << "T"; 

       while(rabbitCount < (rabbitPositions - turtlePositions)) 
       { 
        cout << "-"; 
        rabbitCount = rabbitCount+1; 
       } 
       cout << "H"; 

      } 

      if(rabbitPositions < turtlePositions) 
      { 
       while(rabbitCount < rabbitPositions) 
       { 
        cout << "-"; 
        rabbitCount = rabbitCount+1; 
       } 
       cout << "H"; 

       while(turtleCount < (turtlePositions - rabbitPositions)) 
       { 
        cout << "-"; 
        turtleCount = turtleCount+1; 
       } 
       cout << "T"; 

       cout << "\n"; 
      } 
     } 
    } 

    void printWinner(int rabbitPosition, int turtlePosition) 
    { 
     if(turtlePosition >= 70 && rabbitPosition < 70) 
     { 
      cout << "TORTOISE WINS!!! YAY!!!\n"; 
     } 
     else if(rabbitPosition >=70 && turtlePosition < 70) 
     { 
      cout << "Hare wins. Yuch.\n"; 
     } 
     else if(rabbitPosition >=70 && turtlePosition >=70) 
     { 
      cout << "It's a tie\n"; 
     } 
    } 

    void tie(int turtlePosition, int rabbitPosition) 
    { 
     if(rabbitPosition >=70 && turtlePosition >=70) 
      ExecuteRace(); 
    } 
}; 


void main() 
{ 
    Race race; 
    race.ExecuteRace(); 
} 
+0

La fonction main renvoie toujours int, jamais vide. Les gens qui utilisent cela comme un shibboleth vous jugeront pour cela, et votre programme aura un comportement indéfini. –

+0

"Les gens qui utilisent cela comme un shibboleth" hahaha bon. J'utilise juste le même code que l'OP pour qu'il sache ce qui va où. –

1

Vous avez pas de fonction principale.

plus grande différence de C++ de Java est que sa fonction principale() a cette signature (paramètres facultatifs):

int main(int argc, char** argv); 

Et il est dans l'espace de noms global. C'est la fonction invoquée au démarrage du programme, et probablement pourquoi il vous manque un symbole.

Essayez d'ajouter ceci à votre programme:

int main() { 
    Race r; 
    r.main(); 
    return 0; 
} 

Vous pouvez en finir avec la classe tout à fait, puisque vous n'êtes pas en train de faire quelque chose avec elle.

Questions connexes