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

Langage C++ Discussion :

Créer un classe (objet) en contenant un autre?


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 20
    Points
    20
    Par défaut Créer un classe (objet) en contenant un autre?
    Bonsoir à tous, voici mon problème.
    Pour un devoir en C++ (je débute en c++ et je connais java un peu plus)
    je dois créer une classe Grille (servira à faire une grille de jeu quelconque).
    Dans le construsteur de la classe en question, je crée un tableau dynamique en 2D. Mon problème est le suivant: je veux écrire une fonction me permettant d'accéder à une case de la grille (indice du tableau).

    Ex:

    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
    Grille::Grille(int germe, int dim){
    	this->germe = germe;
    	this->dim = dim;
     
    	// Appel au consructeur du germe
    	OutilsTp1 outil ( germe );
     
    	// Creation du tableau 2D
    	int ** grille = new int *[dim];
    	for( int i = 0; i < dim; i++ ) {
    		grille[i] = new int[dim];
    	}
     
    	// Remplissage aleatoire de la grille
    	for ( int i = 0; i < dim; ++i ) {
    		for ( int j = 0; j < dim; ++j ) {
    		    if ( i != 0 || j != 0 ) {
    		    	grille[i][j] = outil.donnerNombre();
    		    } // if
    		} // for j
    	} // for i
    }
    Donc dans un main je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Grille * g = new Grille(3,8);
    Comment accéder à l'indice [x][y] de la grille si en fait cette dernière ne comporte pas d'indice car elle utilise un tableau.

    Je comprend bien comment accéder à l'indice [x][y] d'un tableau mais je ne vois pas comment écrire une fonction me permettant de faire la même chose pour la grille.

    J'espère que vous comprendrez ce que j'essai de dire.

    Merci mille fois!

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Pour la classe Grille, tu ne peux pas surcharger un double []. Tu peux alors passer par une surcharge de l'opérateur () prenant la ligne et la colonne en paramètre :
    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
     
    /**
    @pre (ligne_<dim)&&(colone_<dim)
    */
    int Grille::operator()(int ligne_, int colonne_) const
    {
       return grille[ligne_,colonne_);
    }
     
    // appel :
    Grille g(3,8);
    for(int i=0;i<8;++i)
       for(int j=0;j<8;++j){
          std::cout<<g(i,j)<<" ";
       }
       std::cout<<"\n";
    }
    Quelques remarques :
    -> Si tu as le même nombre de colonne pour chaque ligne, tu peux allouer un seul buffer : int *grille = new int[dim*dim];, puis y accéder grille[ligne_*dim + colonne_]. Une seule allocation est déjà bien assez pénible à correctement gérer.
    -> Si ta classe gère un pointeur nu, tu devras penser à définir correctement les destructeurs, constructeurs de copie et opérateur = et te préoccuper sérieusement des exceptions (cf F.A.Q. : Comment gérer proprement des allocations / désallocations de ressources ? Le RAII !)
    -> Pour faciliter les choses, tu devrais regarder du côté des pointeurs intelligents (Présentation des pointeurs intelligents en C++, par Loïc Joly)
    -> Cependant, le plus simple, sauf si l'exercice porte explicitement sur les allocations dynamiques, est quand même d'utiliser un std::vector à la place de ton tableau dynamique.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Merci 3DArchi, mais j'ai toujours un problème. Donc soit je ne comprends pas ta réponse (ce qui est fort propable) soit tu ne comprends pas ma question.

    Je me réexplique en espérant que ce n'est pas moi qui n'ai pas comprit la réponse.

    Pour mon exercice je dois: Utilisier un tableau dynamique, définit dans le constructeur de la classe Grille. C'est sa mon problème. Si je crée le tableau dans le construsteur aulieu qu'entant qe variable globale, comment puis-je accéder au "cases" de la grille ou meme tout simplement faire un déconstructeur? Si tu avais bien compris ma question je vais de ce pas lire les liens de ton message précédant, sinon, est-il possible de déclarer le tableau 2D DANS le constructeur de la classe Grille pour ensuite y accéder et le détruire? Merci

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    La variable grille que tu déclares dans le constructeur devrait en fait être une variable de ta classe :
    Grille.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Grille
    {
    public :
     // [..]
    private:
       int **m_grille;
       int m_germe;
       int m_dim;
    }
    Grille.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
    Grille::Grille(int germe, int dim)
       :m_germe(germe),m_dim(dim)
    {
     
    	// Appel au consructeur du germe
    	OutilsTp1 outil ( m_germe );
     
    	// Creation du tableau 2D
    	m_grille = new int *[m_dim];
    	for( int i = 0; i < m_dim; i++ ) {
    		m_grille[i] = new int[m_dim];
    	}
     
    	// Remplissage aleatoire de la grille
    	for ( int i = 0; i < m_dim; ++i ) {
    		for ( int j = 0; j < m_dim; ++j ) {
    		    if ( i != 0 || j != 0 ) {
    		    	m_grille[i][j] = outil.donnerNombre();
    		    } // if
    		} // for j
    	} // for i
    }
    Puisqu'il s'agit d'un exercice sur l'allocation dynamique, il est important de lire et comprendre les 2 liens :
    -> Si ta classe gère un pointeur nu, tu devras penser à définir correctement les destructeurs, constructeurs de copie et opérateur = et te préoccuper sérieusement des exceptions (cf F.A.Q. : Comment gérer proprement des allocations / désallocations de ressources ? Le RAII !)
    -> Pour faciliter les choses, tu devrais regarder du côté des pointeurs intelligents (Présentation des pointeurs intelligents en C++, par Loïc Joly)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Effectivement, définir la varable grille en tant que variable de classe règle mon probleme!

    Merci mille fois, t'es le meilleur!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide pour créer une classe objet
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 18/03/2014, 00h25
  2. Réponses: 3
    Dernier message: 02/01/2010, 23h21
  3. Créer jar exécutable d'un projet contenant d'autres jar
    Par a tunar with no tune dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/12/2007, 00h13
  4. Réponses: 2
    Dernier message: 30/01/2007, 09h02
  5. Réponses: 4
    Dernier message: 15/03/2006, 11h22

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