Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 03/03/2013, à 18:12

no_spleen

[Résolu] C++ erreur d'édition de lien

Bonjour à tous,

J'ai débuté la programmation d'un petit module de jeu d'échecs, j'en suis à la représentation de l'échiquier et j'ai une erreur à l'édition de lien que je n'arrive pas à résoudre.

Voici comment j'ai structuré la chose :
- Une classe square : chaque case contient dans ses membres son numéro de case et des pointeurs vers les 8 cases adjacentes
- Une classe board : rassemble toutes les cases de l'échiquier dans un std::vector.

Je souhaite ajouter une fonction board::get_iterator qui retourne un iterateur sur le vecteur de cases, et c'est à l'édition de lien de cette fonction que j'ai une erreur.

Voici mes fichiers
iterator.h

#ifndef ITERATOR_H
#define ITERATOR_H

#include <vector>

template <class Item>
class Iterator {
public :
   virtual void First() = 0;
   virtual void Next() = 0;
   virtual bool IsDone() = 0;
   virtual Item CurrentItem() = 0;
protected:
   Iterator();
};


template <class Item>
class VectorIterator : public Iterator <Item>{
public :
   VectorIterator(std::vector<Item>* aVec);
   virtual void First();
   virtual void Next();
   virtual bool IsDone();
   virtual Item CurrentItem();
protected:
   std::vector<Item> *_vec;
   int _current;
};

#endif

iterator.cpp

#include "iterator.h"

template < class Item >
VectorIterator<Item>::VectorIterator(std::vector<Item>* aVec)
{
  _vec = aVec;
  _current=0;
};

template < class Item >
void VectorIterator<Item>::First()
{
   _current=0;
};

template < class Item >
void VectorIterator<Item>::Next()
{
   _current++;
};

template < class Item >
bool VectorIterator<Item>::IsDone()
{
  return _current >= _vec->size();
};


template < class Item >
Item  VectorIterator<Item>::CurrentItem()
{
   return (*_vec)[_current];
};

square.h

#ifndef SQUARE_H
#define SQUARE_H

class square
{
   private :
     static int nb_squares;
     int num;
     square* nxt_0;
     square* nxt_1;
     square* nxt_2;
     square* nxt_3;
     square* nxt_4;
     square* nxt_5;
     square* nxt_6;
     square* nxt_7;
   public :
     square();
     ~square();
     void set_next(int , square*);
     square* get_next(int);
     inline int get_num(){return num;};
};


#endif

square.cpp

#include <iostream>
#include "square.h"


int square::nb_squares = 0;

square::square()
{
   nb_squares++;
   num = nb_squares;
   nxt_0 =0;
   nxt_1 =0;
   nxt_2 =0;
   nxt_3 =0;
   nxt_4 =0;
   nxt_5 =0;
   nxt_6 =0;
   nxt_7 =0;
};

square::~square()
{
   delete nxt_0;
   delete nxt_1;
   delete nxt_2;
   delete nxt_3;
   delete nxt_4;

   delete nxt_5;
   delete nxt_6;
   delete nxt_7;
};

void square::set_next(int nxt , square* sq)
{
   switch (nxt)
   {
     case 0 :
        nxt_0 = sq;
     case 1 :
        nxt_1 = sq;
     case 2 :
        nxt_2 = sq;
     case 3 :
        nxt_3 = sq;
     case 4 :
        nxt_4 = sq;
     case 5 :
        nxt_5 = sq;
     case 6 :
        nxt_6 = sq;
     case 7 :
        nxt_7 = sq;
   }
};


square* square::get_next (int nxt)
{
   switch (nxt)
   {
     case 0 :
        return nxt_0 ;
     case 1 :
        return nxt_1 ;
     case 2 :
        return nxt_2 ;
     case 3 :
        return nxt_3 ;
     case 4 :
        return nxt_4 ;
     case 5 :
        return nxt_5 ;
     case 6 :
        return nxt_6 ;
     case 7 :
        return nxt_7 ;
   }
   return 0;
};

board.h

#ifndef BOARD_H
#define BOARD_H

#include <vector>
#include "square.h"
#include "iterator.h"

class board
{
private :
   int nb_row , nb_col;
   std::vector<square*> squares;
public :
   board(int nb_row , int nb_col);
   square* get_square(int num);
   Iterator<square*>* get_iterator();
};


#endif

board.cpp

#include "board.h"
#include <iostream>



board::board(int _nb_row , int _nb_col)
{

   nb_row = _nb_row;
   nb_col = _nb_col;
   for (int i=0 ; i<nb_row ; i++)
   {
      for (int j=0 ; j<nb_col ; j++)
      {
         squares.push_back(new square);
      }
   }

   int nb_squares = nb_row * nb_col;
   for (int i=0 ; i < nb_squares; i++)
   {
     int row = i / nb_col + 1;
     int col = i%nb_col +1;

     // rangée du dessus
     if ( row < nb_row)
     {
        squares[i]->set_next(1,get_square(i+nb_col));
        if (col < nb_col)
        {
              squares[i]->set_next(2,get_square(i+nb_col+1));
        }
        if (col != 1)
        {
              squares[i]->set_next(0,get_square(i+nb_col-1));
        }
     }

     // case de droite
     if (col < nb_col)
        squares[i]->set_next(4,get_square(i+1));

     // case de gauche
     if (col != 1)
        squares[i]->set_next(3,get_square(i-1));

     // rangée du bas
     if (row > 1)
     {
        squares[i]->set_next(6,get_square(i-nb_col));
        if (col < nb_col)
                squares[i]->set_next(7,get_square(i-nb_col+1));
        if (col != 1)
                squares[i]->set_next(5,get_square(i-nb_col-1));
     }
   }
};


square* board::get_square(int num)
{
   if (num > nb_row*nb_col  || num < 0)
   {
      return 0;
   }
   else
   {
      return squares[num];
   }
};

Iterator<square*>* board::get_iterator()
{
   return new VectorIterator<square*>(&squares);
};

Et quand je veux compiler, j'ai cette erreur

board.o: dans la fonction « board::get_iterator() »:
board.cpp:(.text+0x41c): référence indéfinie vers « VectorIterator<square*>::VectorIterator(std::vector<square*, std::allocator<square*> >*) »
collect2: erreur: ld a retourné 1 code d'état d'exécution

Est-ce que vous voyez l'erreur ?

Merci de votre aide,

Dernière modification par no_spleen (Le 07/03/2013, à 20:21)

Hors ligne

#2 Le 07/03/2013, à 19:03

no_spleen

Re : [Résolu] C++ erreur d'édition de lien

Je n'ai toujours pas trouvé la solution, donc si une personne à une piste :-)

Hors ligne

#3 Le 07/03/2013, à 20:20

no_spleen

Re : [Résolu] C++ erreur d'édition de lien

Bon, il a suffit que je valide le message précédent pour que l'erreur me saute aux yeux. Iterator est une classe template, et j'avais placé la définition et l'implémentation dans deux fichiers différents...

Merci à ceux qui ont réfléchi au problème !

Dernière modification par no_spleen (Le 07/03/2013, à 20:20)

Hors ligne

#4 Le 07/03/2013, à 21:25

pingouinux

Re : [Résolu] C++ erreur d'édition de lien

Bonsoir no_spleen,
Pourrais-tu préciser ce qu'il faut modifier ? Je ne connais pas suffisamment le C++ pour trouver l'erreur, même avec ton explication du #3.

En ligne

#5 Le 07/03/2013, à 21:31

no_spleen

Re : [Résolu] C++ erreur d'édition de lien

Bonjour pingouinux,

Le contenu du fichier iterator.cpp doit se trouver dans le fichier iterator.h (il n'y a donc pas de fichier iterator.cpp). Ceci car l'implémentation des fonctions templates doit se trouver dans le même fichier que leurs déclarations.

Je ne peux malheureusement pas te donner plus de détails car je ne suis pas non plus un expert en C++. Ce petit projet est justement un moyen de m'y remettre !.

Dans les versions des sources de mon premier message, j'ai aussi oublié les instructions break dans le switch de la fonction square::set_next.

J'espère avoir été plus clair.

Bàt,

Hors ligne

#6 Le 08/03/2013, à 09:13

pingouinux

Re : [Résolu] C++ erreur d'édition de lien

Merci smile

En ligne

Haut de page ↑