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 :

Cr�ation d'une classe Tableau2d


Sujet :

C++

  1. #1
    Membre confirm�
    Inscrit en
    Mai 2008
    Messages
    187
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par d�faut Cr�ation d'une classe Tableau2d
    Bonjour,
    Je dois cr�er une classe Tableau � 2D d'entiers (Array) divis�e dans un fichier .h et un .cpp
    Ma classe ressemblera donc � ceci:

    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
     
    class Array {
    	int ** array;
    	unsigned nbLig;
    	unsigned nbCol;
     
    public:
    	//Constructeurs
    	Array(unsigned nbL=1, unsigned nbC=1, int valInit=0);
    	Array(const Array & a);
     
    	//Destructeur
    	~Array();
     
    	//Surcharge affectation
    	Array & operator= (const Array & a);
     
    	//Accesseurs
    	unsigned getNbLig() const;
    	unsigned getNbCol() const;
    };
    J'ai un petit probl�me pour mon constructeur avec 3 param�tres: je dois donc cr�er un tableau dynamique interne � 2D et pouvoir utiliser dans les autres m�thodes de la classe l'�criture: array[x][y] pour acc�der aux entiers.

    Voici mon constructeur, j'initialise nbLig et nbCol mais il me reste � cr�er le tableau et initialiser chaque case avec valInit... :

    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
     
    Array::Array(unsigned int nbL, unsigned int nbC, int valInt)
    {
    	if(nbL==0)
    		nbLig=1;
    	else
    		nbLig=nbL;
     
    	if(nbC==0)
    		nbCol=1;
    	else
    		nbCol=nbC;
     
    .........????????????.............
    }
    Merci d'avance et bonne soir�e.

  2. #2
    Membre �prouv� Avatar de Nhaps
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par d�faut
    Une double boucle for suffit pour initialiser chaque case du tableau
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    for( uint i = 0; i < nbLig; ++i)
    	for( uint j = 0; j < nbCol; ++j)
    		array[i][j] = valInt;

  3. #3
    Membre confirm�
    Inscrit en
    Mai 2008
    Messages
    187
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par d�faut
    Merci, cela semble aller.
    Mais pour la cr�ation du tableau � 2D dynamique? Pouvez vous m'aider?

    Merci d'avance.

  4. #4
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    FAQ ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  5. #5
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par d�faut
    Bonjour,

    pour allouer ton tableau il faut d'abord allouer les pointeurs sur ligne, puis les colonnes. Cela donne ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Array(unsigned nbL, unsigned nbC, int valInit)
    {
        nbLig = nbL;
        nbCol = nbC;
        array = new int*[nbL]; // creation des lignes
        for (int i=0;i<nbL;++i)
        {
            array[i] = new int[nbC]; // création des colonnes
            for (int j=0;j<nbC;++j)
                array[i][j] = valInit;
        }
    }
    Cette �criture te permet de comprendre le principe de construction mais il est plus performant de passer par des listes d'initialisation comme ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Array(unsigned nbL, unsigned nbC, int valInit)
        :nbLig(nbL),nbCol(nbC),array(new int*[nbL])
    {
        for (int i=0;i<nbL;++i)
        {
            array[i] = new int[nbC]; // création des colonnes
            for (int j=0;j<nbC;++j)
                array[i][j] = valInit;
        }
    }

  6. #6
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    La version de la FAQ est robuste...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  7. #7
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218

  8. #8
    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
    Par d�faut
    Bonjour,
    Si l'�nonc� de ton exercice ne stipule pas explicitement qu'il faut faire un tableau de tableau, alors je proposerais de faire une seule allocation :nbrLigne*nbrColonne. Puis d'utiliser l'indexation (lig,col) => lig*NbrColonne + col

  9. #9
    Membre confirm�
    Inscrit en
    Mai 2008
    Messages
    187
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par d�faut
    Parfait, merci.
    Je devais �galement faire un constructeur par copie et la surcharge de certains op�rateurs: = == ++(pr�incr�mentation) () (fonction)
    Pouvez vous me dire si c'est correct ce que j'ai fait?

    Merci d'avance!

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    Array::~Array()
    {
    	for (unsigned i = 0 ; i<nbLig ; i++)
    		delete [] array[i];
    	delete [] array;
    	array=0;
    	nbLig=0;
    	nbCol=0;
    }
     
    Array::Array(const Array & a) throw (int)
    {
    	if (a.nbCol==0 || a.nbLig==0)
    	{
    		array=0;
    		nbCol=0;
    		nbLig=0;
    	}else{
    		array=new int*[nbLig=a.nbLig];
    		for (unsigned i = 0 ; i<nbLig ; i++)
    			array[i]=new int[nbCol=a.nbCol];
    		if(array==0)
    			throw 6;
    		for (unsigned i = 0 ; i<nbLig ; i++)
    			for (unsigned j = 0 ; j<nbCol ; j++)
    				array[i][j]=a.array[i][j];
    	}
    }
     
    Array & Array::operator= (const Array & a) throw (int)
    {
    	if (this != &a)
    	{
    		this->~Array();
    		if (a.nbLig != 0 && a.nbCol != 0){
    			array=new int*[nbLig=a.nbLig];
    			for (unsigned i=0 ; i<nbLig ; i++)
    				array[i]=new int[nbCol=a.nbCol];
    			if (array==0)
    				throw 7;
    			for (unsigned i = 0 ; i<nbLig ; i++)
    				for (unsigned j = 0 ; j<nbCol ; j++)
    					array[i][j]=a.array[i][j];
    		}
    	}
    	return *this;
    }
     
    bool Array::operator==(const Array & a) const
    {
    	bool verif=true;
    	if ((a.nbCol!=nbCol) || (a.nbLig!=nbLig))
    		verif = false;
    	else
    		for (unsigned i=0 ; i<nbLig ; i++)
    			for (unsigned j=0 ; j<nbCol ; j++){
    				if (array[i][j]!=a.array[i][j])
    					verif=false;
    			}
    	return verif;
    }
     
    Array & Array::operator++()
    {
    	for (unsigned i = 0 ; i<nbLig ; i++)
    		for (unsigned j = 0 ; j<nbCol ; j++)
    			array[i][j]++;
     
    	return *this;
    }
    Il me reste juste l'oparateur fonction: () que je n'arrive pas � faire.
    Il doit retourner une r�f�rence sur l'entier dont les numLig et numCol sont donn�s en param�tre.

    Merci d'avance pour votre aide!

  10. #10
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    a- destructeur : les RAZ sont de moindre int�r�t

    b- ctr de copie
    -> les sp�c d'exception, c'est une arnaque => � bannir (on en parle peut-�tre dans la FAQ)
    -> un new ne renverra jamais 0, pas depuis que les compilos suivent la norme de ... 98 (oui, c'est vieux) ; et � supposer qu'un 0 soit bien renvoy�, il y aurait eu une vilaine fuite de m�moire avec ton code.
    -> bref, la m�thode correcte est dans la FAQ (ter)

    c- l'affectation. Ouille, ouille, ouille. Revend de suite ton bouquin de C++, ou garde le pour la chemin�e cet hiver.
    Je suis s�rieux. Les circonstances o� tu iras appeler explicitement un destructeur sont excessivement rares, et toutes li�s � l'utilisation du new de placement -- tu n'y es pas encore.
    De plus, tu utilises un anti-idiome avec le test pessimiste d'autoaffectation, qui ne r�gle pas le cas des lev�es d'exception.
    Une fois de plus, je t'invite � consulter la FAQ.

    d- test d'�galit� : pas la peine de continuer d�s qu'une diff�rence est trouv�e => return false (je n'aime pas le SESE -- single Entry single exit --, il est totalement d�plac� et d�pass� en C++)
    (ce n'est pas une erreur, juste un truc optimisable)

    e- l'incr�mentation n'a aucun sens sur une matrice.
    � moins que cela te soit impos� par un prof, c'est � ne pas faire (d�tourner une op�rateur pour lui faire faire des trucs qui ne sont pas intuitifs � la lecture du code utilisateur)

    f- pour ta question, r�ponse dans la FAQ C++ lite, de s�r.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  11. #11
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par d�faut
    Il y a deux operateurs () � impl�menter :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    int& operator()(int const,int const); // pour modifier un coefficient
    int const& operator()(int const,int const) const; // pour accéder à un coefficient
    Ces deux fonctions se pr�tent bien � l'expansion de code (inline) pour gagner en performances :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    inline int& Array::operator()(int const numlig,int const numcol)
    {
        return array[numlig][numcol];
    }
    inline int const& Array::operator()(int const numlig,int const numcol) const
    {
        return array[numlig][numcol];
    }
    Il faut lancer une exception dans le cas o� numlig ou numcol n'est pas dans le bon range. Pour emp�cher qu'ils soient n�gatifs, le plus simple est d'utiliser size_t plut�t que int dans la gestion des indices :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    int& operator()(size_t const,size_t const); // pour modifier un coefficient
    int const& operator()(size_t const,size_t const) const; // pour accéder à un coefficient
    Je crois me souvenir que size_t est d�fini dans cstddef.h. Il reste � traiter les cas ou numlib ou numcol sont sup�rieurs aux dimensions du tableau.

    Pour les copies de tableau � tableau, tu peux utiliser la fonction memcpy qui est plus rapide.

Discussions similaires

  1. Cr�ation d'une classe ASP (connection & recordset)
    Par polothentik dans le forum ASP
    R�ponses: 1
    Dernier message: 12/03/2008, 00h46
  2. [POO] cr�ation d'une classe de connexion
    Par artotal dans le forum Langage
    R�ponses: 1
    Dernier message: 14/02/2008, 12h01
  3. R�ponses: 3
    Dernier message: 06/05/2007, 19h46
  4. [C++] Cr�ation d'une classe dans un fichier
    Par Pfeffer dans le forum C++Builder
    R�ponses: 1
    Dernier message: 02/05/2007, 15h49
  5. Cr�ation d'une class contenant un TEdit (D�butant)
    Par Dereck07 dans le forum Delphi
    R�ponses: 5
    Dernier message: 01/05/2007, 17h02

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