IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

comment résoudre un problème de multiple définition


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut comment résoudre un problème de multiple définition
    Bonjour à tous ;
    j'ai plusieurs fichiers et plusieurs classes ; mais j'ai nommé SS une matrice composée de Case
    commun.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifndef COMMUN_H_
    #define COMMUN_H_
     
     std::vector< std::vector<Case*> > SS(10,std::vector<Case*>(10));
    #endif /* COMMUN_H_ */
    Plateau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #ifndef _PLATEAU_H
    #define	_PLATEAU_H
    #include <vector>
    #include "Case.h"
    #include "Piece.h"
     
     
     
    class Plateau {
     
    	protected:
     
     
     
    public:
        Plateau();
        Plateau(const Plateau& orig);
        virtual ~Plateau();
        void Affichage();
        void Affichage2(Piece& P1);
     
    public  :
     
     
     
     
    };
    Plateau.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include "Plateau.h"
    #include "Case.h"
    #include "Pion.h"
    #include <iostream>
    #include "Commun.h"
    
    using namespace std ;
    
    Plateau::Plateau(){
    Case* P1 = new Case(0,9,' ');
    	Case* P2 = new Case(1,9,'a');
    	Case* P3 = new Case(2,9,'b');
    	Case* P4 = new Case(3,9,'c');
    	Case* P5 = new Case(4,9,'d');
    	Case* P6 = new Case(5,9,'e');
    
    SS[0][0] = P1;
    	SS[0][1] = P2;
    	SS[0][2] = P3;
    	SS[0][3] = P4;
    	SS[0][4] = P5;
    	SS[0][5] = P6;
    
    }
    et dans piece.cpp j'ai encore besoin de SS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Piece::Piece(int col, int lig, char* coul, char etiq){
    
    	// on lie le pointeur à la case concernée
    
    this->place = SS[lig][col];
    place->SetEtiquetteCase(etiq);
    couleur = coul ;
    etiq_Piece = etiq;
    
    
    }
    mais mon problème c'est que algré le fait que j'ai tenté de mettre dans un fichier à part commun.h le vector SS
    Eclipse m'indique tjrs des messages de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Description	Resource	Path	Location	Type
    first defined here	Chess		line 0, external location: src/Plateau.o:C:\MinGW\include\c++\3.4.5\bits\stl_vector.h	C/C++ Problem
    Description	Resource	Path	Location	Type
    multiple definition of `SS'	Chess		line 0, external location: C:\MinGW\include\c++\3.4.5\ext\new_allocator.h	C/C++ Problem
    et le problème c'est qu'il n'indique pas où se trouve l'erreur mais seulement sur la console

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Si je comprend bien, tu essaies d'utiliser la variable SS comme une variable globale ? Ca me semble pas top comme approche.

    remarques :
    - pourquoi créer une classe "case" ? a priori, elle n'a aucune fonction (à part se dessiner ?)
    - SS a priori devrait être membre de Plateau
    - d'un point de vue "objets", tu as un plateau qui contient plusieurs pieces de différents types. Ca te donne les class et les relations entre les classes
    - perso, j'aime pas des vector de vector, je préfère un vector de taille n*m avec un accesseur

    Voila comment je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    enum Couleur {BLANC, NOIR}
     
    class Piece
    {
       Piece(int x, int y, Type t, Couleur C);
       virtual dessine_piece();
    };
     
    class Tour : public Piece
    {
    };
     
    class Fou : public Piece
    {
    };
     
    // à faire pour chaque type de piece
    Plateau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "Piece.h"
     
    class Plateau
    {
       Plateau();
       dessine_plateau();
       vector<Piece*> pieces;
    };
    Plateau.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include "Plateau.h"
     
    Plateau::Plateau()
    {
       // initialisation des pièces au début de partie
       pieces.push_back(new Tour(1, 1, BLANC));
       pieces.push_back(new Fou(1, 2, BLANC));
       // à faire pour chaque piece
     
       // on dessine le plateau et les pieces
       dessine_plateau();
    }
     
    Plateau::dessine_plateau()
    {
       // on dessine chaque case
       for(int x=0; x<8; ++x)
          for(int y=0; y<8; ++y)
             if(est_pair(x+y)) dessine_case_blanche();
             else dessine_case_noir();
     
       for(vector<Piece*>::iterator it=pieces.begin(); it!=pieces.end(); ++it)
          (*it)->dessine_piece();
    }
    Reste plus qu'a gérer les déplacements et les suppressions de pièces.
    Pour dessine, tu peux transmettre un pointeur vers ton "outil" de dessin (en fonction de l'environnement sur lequel tu travailles) dans les fonctions "dessine_" ou lors de la création des objets.

  3. #3
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Bonjour

    Si je comprend bien, tu essaies d'utiliser la variable SS comme une variable globale ? Ca me semble pas top comme approche.

    remarques :
    - pourquoi créer une classe "case" ? a priori, elle n'a aucune fonction (à part se dessiner ?)
    - SS a priori devrait être membre de Plateau
    - d'un point de vue "objets", tu as un plateau qui contient plusieurs pieces de différents types. Ca te donne les class et les relations entre les classes
    - perso, j'aime pas des vector de vector, je préfère un vector de taille n*m avec un accesseur

    Voila comment je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    enum Couleur {BLANC, NOIR}
     
    class Piece
    {
       Piece(int x, int y, Type t, Couleur C);
       virtual dessine_piece();
    };
     
    class Tour : public Piece
    {
    };
     
    class Fou : public Piece
    {
    };
     
    // à faire pour chaque type de piece
    Plateau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "Piece.h"
     
    class Plateau
    {
       Plateau();
       dessine_plateau();
       vector<Piece*> pieces;
    };
    Plateau.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include "Plateau.h"
     
    Plateau::Plateau()
    {
       // initialisation des pièces au début de partie
       pieces.push_back(new Tour(1, 1, BLANC));
       pieces.push_back(new Fou(1, 2, BLANC));
       // à faire pour chaque piece
     
       // on dessine le plateau et les pieces
       dessine_plateau();
    }
     
    Plateau::dessine_plateau()
    {
       // on dessine chaque case
       for(int x=0; x<8; ++x)
          for(int y=0; y<8; ++y)
             if(est_pair(x+y)) dessine_case_blanche();
             else dessine_case_noir();
     
       for(vector<Piece*>::iterator it=pieces.begin(); it!=pieces.end(); ++it)
          (*it)->dessine_piece();
    }
    Reste plus qu'a gérer les déplacements et les suppressions de pièces.
    Pour dessine, tu peux transmettre un pointeur vers ton "outil" de dessin (en fonction de l'environnement sur lequel tu travailles) dans les fonctions "dessine_" ou lors de la création des objets.
    -------------------------------------------------------------
    oui j'ai déjà songé à cette idée , sauf que si on suit la logique des chose ; les cases supposées vides aussi sur le plateau sont considérés comme des pièces mais marqués ('_')
    par contre ici ; il y a une distinction réelle entre Case et Pièce , mais la difficulté revient à la gestion de ce pointeur sur la case

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Pourquoi veux tu considérer une case vide comme une pièce ???

    Et quel est ce problème de gestion de pointeur dont tu parles ?

  5. #5
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Pourquoi veux tu considérer une case vide comme une pièce ???

    Et quel est ce problème de gestion de pointeur dont tu parles ?
    -----------------------------------------------------------------------
    car quand on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     vector<Piece*> pieces;
    c'est que le plateau est composé de vecteur dans l'élement est de type pièce ; ceci dit mais si c'est vide (marqué '_' il est tjrs considéré comme pièce mais ni un pion ni un cavalier etc ...)

    le pointeur que j'évoque c'est le pointeur dans la classe Case (place )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Piece {
    
    	private:
    	char* couleur;
    	Case* place;
    	char etiq_Piece;
    le problème c'est que comment déclarer le vector sur plateau ; pour que place puisse le pointer et le reconnaître ??
    j'ai fait cela en séparant le vector SS dans un fichier séparé ("commun.h")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef COMMUN_H_
    #define COMMUN_H_
    #include <vector>
    #include "Case.h"
     
     std::vector< std::vector<Case*> > SS(10,std::vector<Case*>(10));
    #endif /* COMMUN_H_ */
    mais le problème c'est qu'enrevenant dans pièce.cpp il ne reconnait pas SS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "Piece.h"
    #include "Case.h"
    #include "Commun.h"
    Piece::Piece(int col, int lig, char* coul, char etiq){
    
    	// on lie le pointeur à la case concernée
    
    this->place = SS[lig][col];
    place->SetEtiquetteCase(etiq);
    couleur = coul ;
    etiq_Piece = etiq;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Description	Resource	Path	Location	Type
    `SS' was not declared in this scope	Piece.cpp	/Chess/src	line 34	C/C++ Problem
     
    Description	Resource	Path	Location	Type
    unused variable 'SS'	Piece.cpp	/Chess/src	line 34	C/C++ Problem
    mais je crois ; que le code marche comme il faut si on arrive ; à résoudre ce genre de problème .
    en fait j'ai insisté à utiliser une matrice car la suite de mon algo que j'ai déjà préparé pour les différentes pièces est basée sur un tableau à 2 dimensions

    merci !

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Pourquoi veux-tu absolument mettre dans ton vecteur des case vide ? une case vide ne fait rien. Il n'y a pas de raison de la créer.

    Pour partager ton plateau (vecteur de vecteur) tu n'as pas besoin de faire une variable globale :

    plateau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <vector>
    class Case;
     
    class Plateau
    {
       vector< vector<Case*> > cases;
    };
    plateau.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include case.h
     
    // tu utilises ton vecteur
    case.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Plateau;
     
    class Case
    {
       Case(Plateau* parent, /* reste des paramètres*/);
    };
    case.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "plateau.h"
     
    // tu utilises ton vecteur ici aussi avec parent->cases
    Je pense que ton problème est mal conçu et que tu retrouves à utiliser des méthodes "spéciales".

    Essaies de faire les choses par étapes :
    1. créer un programme "plateau" qui dessine un plateau. Compile et fait tourner ton programme pour vérifier qu'il dessine correctement ton plateau.
    2. ajouter 1 pièce dans ton plateau. Compile et fait tourner ton programme pour vérifier que ta pièce se dessine correctement
    3. tu peux ajouter maintenant la gestion des déplacements sur ta pièce. Compile et fait tourner ton programme
    4. pour finir, tu ajoutes plusieurs pièces. Puis compile et fait tourner ton programme.

    Pour résoudre un problème, il faut savoir le découper un plusieurs petits problèmes simpels

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/06/2008, 10h23
  2. Réponses: 19
    Dernier message: 05/01/2008, 16h06
  3. Comment résoudre ce probléme : Exception d'E/S: Connection refused ?
    Par adil_vpb dans le forum Connexions aux bases de données
    Réponses: 17
    Dernier message: 19/11/2007, 16h19
  4. Réponses: 12
    Dernier message: 27/08/2007, 12h33
  5. Réponses: 3
    Dernier message: 19/05/2006, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo