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 :

erreur non comprise cherche solution


Sujet :

C++

  1. #1
    Membre � l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par d�faut erreur non comprise cherche solution
    Salut � tous,

    J'ai un petit un petit soucis de compr�hension d'un message d'erreur lors de la compilation de mon programme

    J'ai definit un tableau de classe Dynamique.Cette classe poss�de elle m�me une variable membre allou� dynamiquement mais petit soucis.

    voici mon code :


    fichier Dynamique. h :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Dynamique  
    {
    public :
    	int i;
    	int * Tableau;
    public:
    	Dynamique();
    	Dynamique(int j); // contructeur
    	Dynamique(const Dynamique &source); // constructeur par copie
    	virtual ~Dynamique(); // destructeur
    	Dynamique &operator=(const Dynamique &Dyn1); // opérateur d'affectation
    };
    --------------------------------------------------------------------------------------
    fichier Dynamique. 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include "Dynamique.h"
     
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    Dynamique::Dynamique()
    {
     
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Dynamique::Dynamique(int j)
    {
    	int i;
    	Tableau=new int[j];
    	for(i=0;i<j;i++)
    		Tableau[i]=i;
    	return;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Dynamique::Dynamique(const Dynamique &source) // Constructeur par copie
    {
    	int k;
    	i=source.i;
    	Tableau=new int[source.i];
    	for(k=0;k>i;k++)
    		Tableau[k]=source.Tableau[k];
    	return;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Dynamique::~Dynamique() // Destructeur
    {
    delete [] Tableau;
    return;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    Dynamique &Dynamique::operator=(const Dynamique &source) // opérateur d'affectation
    {
    	int k;
    	i=source.i;
    	Tableau=new int[source.i];
    	for(k=0;k>i;k++)
    		Tableau[k]=source.Tableau[k];
    	return *this;
    }
    --------------------------------------------------------------------------------------
    le main :

    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 "Dynamique.h"
    #include <stdio.h>
    #include <string.h>
     
    void main()
    {
    	Dynamique *pDyn,*Inter; // Inter variable intermediaire
    	int i,k=5,j=0;
     
     
    	pDyn=new Dynamique[k]; /* déclaration d'un tableau de classe Dynamique de dim 5 */
     
    	for(i=0;i<k;i++)
    	{
    		Inter=new Dynamique(i);
    		for(j=0;j<i;i++) printf(" Inter : %d element : %d \n",i,Inter->Tableau[j]);
    		pDyn[i]=Inter;
    	}
    // liberation de la mémoire
    delete [] Inter;
    for(i=0;i<k;i++) { delete [] pDyn;};
    return;
     
    }
    enfin voici le message d'erreur :

    ... \main.cpp(17) : error C2679 : binary '=' : no operator defined which takes a right-hand operand of type 'class Dynamique *' (or there is no acceptable conversion).
    si je comprend bien, il n'arrive pas a voir la surchage de l'op�rateur = que j'ai d�finit dans le classe Dynamique ...

    Merci pour vos explications et critiques de ce bout de code (et pour vos suggestions).


    [Balises CODE rajout�es par Loulou24, merci d'y penser � l'avenir]

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut


    Et indique la ligne de l'erreur dans ton code (par un commentaire) !!

    Pour toi, la ligne 17 c'est tr�s clair, mais je ne pense pas que beaucoup de personnes ici aient envie de recompter les lignes � la main...

    Edite ton message, stp.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre �prouv� Avatar de amaury pouly
    Profil pro
    Inscrit en
    D�cembre 2002
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 36
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2002
    Messages : 157
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Dynamique &Dynamique::operator=(const Dynamique &source)
    ->ici cet op�rateur ressemble � ��:
    Dynamique->operator=Dynamique
    or toi tu fais:
    avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
     Dynamique *pDyn,*Inter
    donc Inter est du type
    Dynamique *
    donc tu fais une affectation de ce type:
    Dynamique->operator=Dynamique *
    or cet op�rateur n'est pas d�fini donc faut d�f�rencer Inter pour l'affecter:
    Ce que je ne comprend pas c'est que Inter, tu l'alloue o� ???????
    tu fais
    mais je vois pas le new !!!!????[/code]

  4. #4
    Membre � l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par d�faut
    voici le code avec un peu plus de lisibilt�
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
    Fichier Dynamique.h
     
    class Dynamique 
    { 
    public : 
    int i; 
    int * Tableau; 
    public: 
    Dynamique(); 
    Dynamique(int j); // contructeur 
    Dynamique(const Dynamique &source); // constructeur par copie 
    virtual ~Dynamique(); // destructeur 
    Dynamique &operator=(const Dynamique &Dyn1); // opérateur d'affectation 
    }; 
    -------------------------------------------------------------------------------------- 
    fichier Dynamique. cpp : 
     
    #include "Dynamique.h" 
     
    ////////////////////////////////////////////////////////////////////// 
    // Construction/Destruction 
    ////////////////////////////////////////////////////////////////////// 
    Dynamique::Dynamique() 
    { 
     
    } 
    //////////////////////////////////////////////////////////////////////////////////////////////// 
    Dynamique::Dynamique(int j) 
    { 
    int i; 
    Tableau=new int[j]; 
    for(i=0;i<j;i++) 
    Tableau[i]=i; 
    return; 
    } 
    //////////////////////////////////////////////////////////////////////////////////////////////// 
    Dynamique::Dynamique(const Dynamique &source) // Constructeur par copie 
    { 
    int k; 
    i=source.i; 
    Tableau=new int[source.i]; 
    for(k=0;k>i;k++) 
    Tableau[k]=source.Tableau[k]; 
    return; 
    } 
    //////////////////////////////////////////////////////////////////////////////////////////////// 
    Dynamique::~Dynamique() // Destructeur 
    { 
    delete [] Tableau; 
    return; 
    } 
    //////////////////////////////////////////////////////////////////////////////////////////////// 
    Dynamique &Dynamique::operator=(const Dynamique &source) // opérateur d'affectation 
    { 
    int k; 
    i=source.i; 
    Tableau=new int[source.i]; 
    for(k=0;k>i;k++) 
    Tableau[k]=source.Tableau[k]; 
    return *this; 
    } 
    -------------------------------------------------------------------------------------- 
    le main : 
     
    #include "Dynamique.h" 
    #include <stdio.h> 
    #include <string.h> 
     
    void main() 
    { 
    Dynamique *pDyn,*Inter; // Inter variable intermediaire 
    int i,k=5,j=0; 
     
     
    pDyn=new Dynamique[k]; /* déclaration d'un tableau de classe Dynamique de dim 5 */ 
     
    for(i=0;i<k;i++) 
    { 
    Inter=new Dynamique(i); 
    for(j=0;j<i;i++) printf(" Inter : %d element : %d \n",i,Inter->Tableau[j]); 
    pDyn[i]=Inter; 
    } 
    // liberation de la mémoire 
    delete [] Inter; 
    for(i=0;i<k;i++) { delete [] pDyn;}; 
    return; 
     
    }
    la ligne 17 qui g�n�re l'erreur \main.cpp(17) : error C2679 : binary '=' : no operator defined which takes a right-hand operand of type 'class Dynamique *' (or there is no acceptable conversion). est pDyn[i]=Inter;

    en fait j'alloue Inter lign5 Inter=new Dynamique(i); dans la boucle for du main.

    le but de la manoeuvre est de cr�er un tableau dynamique d'instance de classe Dynamique. Cette classe ayant comme donn�e membre un tableau d'entier allou� dynamiquement.
    Je me m�lange les pinceaux entre la d�claration du tableau d'instance de classe Dynamique :

    Dynamique *pDyn

    son allocation dynamique de la m�moire
    pDyn=new Dynamique[k];

    et l'allocation du tableau d'entier dans chaque membre de pDyn.

    En fait, je ne sais pas comment sp�cifier la taille du tableau d'entier de chaque instance de pDyn. Ca doit �tre dans le constructeur mais je ne vois pas ou et comment (c'est pour cela que je passe par une variable interm�diaire Inter).

    j'esp�re avoir �t� plus clair (c'est pas gagn�)

    merci.

  5. #5
    Membre �prouv� Avatar de amaury pouly
    Profil pro
    Inscrit en
    D�cembre 2002
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 36
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2002
    Messages : 157
    Par d�faut
    il y a des trucs qui vont pas dans ton code:
    tu alloue pDyn ainsi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    pDyn=new Dynamique[k];
    mais tu le lib�re ainsi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    for(int i=0;i<k;i++)
        delete []pDyn;
    or �� ne sert � rien de faire un for, il faut faire:
    et puis c'est tout et la ligne 17 doit devenir:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    pDyn[i]=*Inter:// note que l'ont déférence Inter .

  6. #6
    Membre � l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par d�faut
    Merci pour tes r�ponses. Effectivement si je comprend bien :

    Concernant
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    delete []pDyn //au lieu de 
    for(int i=0;i<k;i++) 
        delete []pDyn;
    il n'y a pas besoin de boucle for pour lib�rer pDyn car c'est un pointeur sur une instance Dynamique et non un tableau de pointeur.

    Pour

    *Inter est un pointeur sur un objet de classe Dynamique.
    En faisant
    Inter contient une adresse m�moire pouvant "acceuillir" un objet Dynamique.
    avec for(j=0;j<i;i++) printf(" Inter : %d element : %d \n",i,Inter->Tableau[j]);, on affecte des valeurs au tableau membre de Inter.

    avec
    on appelle la fonction de surcharge de l'op�rateur d'affectation
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Dynamique &Dynamique::operator=(const Dynamique &source)
    Cette fonction renvoie l'adresse d'un objet Dynamique &Dynamique
    et prend comme argument une adresse const Dynamique &source

    ce que je ne pige pas c'est qu'en faisant
    *Inter est une valeur et pas une adresse (valeur que contient l'adresse du pointeur), alors que l'op�rateur = attend une adresse comme argument.

    J'ai donc pas encore tout compris au C++ , merci pour vos r�ponses.

  7. #7
    Membre �prouv� Avatar de amaury pouly
    Profil pro
    Inscrit en
    D�cembre 2002
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 36
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2002
    Messages : 157
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Dynamique &Dynamique::operator=(const Dynamique &source)
    tu n'as pas compris ceci en fait:
    ici on passe un object de type dynamique constant par r�f�rence: �� veut dire qu'on le passe en tant qu'object(en pas par valeur) mais que le compilo lui traduit par une adresse .
    donc en fait il faut d�f�rencer Inter pour obtenir l'object(et pas sont adresse) .
    Si tu voulais faire la m�me chose avec l'adresse il faudrait �crire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Dynamique &Dynamique::operator=(const Dynamique *source)

  8. #8
    Membre � l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par d�faut
    Oui, je commence a comprendre, par contre je ne comprends pas bien la signification de d�f�rencer Inter pour obtenir l'object ?

    Sinon ca compile (VC++) par contre ca renvoie 2 erreurs � priori si je comprend bien c'est l'�dition des liens qui marche pas.

    compiling...
    main.cpp
    Linking...
    LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/test2.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    test2.exe - 2 error(s), 0 warning(s)


    Meric pour tes r�ponses

  9. #9
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut
    �a ressemble � une erreur de projet win32

    as tu par hasard voulu cr�er un projet win32 avec une fonction main comme point d'entr�e ?

  10. #10
    Membre �prouv� Avatar de amaury pouly
    Profil pro
    Inscrit en
    D�cembre 2002
    Messages
    157
    D�tails du profil
    Informations personnelles :
    �ge : 36
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2002
    Messages : 157
    Par d�faut
    Oui, je commence a comprendre, par contre je ne comprends pas bien la signification de d�f�rencer Inter pour obtenir l'object ?
    quand on a un pointeur:
    et bien quand tu utilise a, cela repr�sente l'ADRESSE .
    donc si tu fais:
    tu vas obtenir comme 2454245441: c'est l'adresse .

    �videmment �� n'int�resse pas bcp de monde l'adresse(encore que moi je m'en sert): ce qui sert, c'est ce que pointe cette adresse .
    pour obtenir la valeur point�e par un pointeur, on d�f�rence ce pointeur:
    et l� �� affichera la valeur de a .
    Ceci est valable pour tout type(on doit m�me pourvoir red�fini l'op�rateur) .
    Dans ton cas on fait
    pour obtenir la valeur de Inter(cad l'object Inter) et non pas son adresse puisque dans ta d�claration de l'op�rateur = tu veux l'objet Dynamique et pas son adresse .

    j'esp�re que j'ai �t� assez clair[/quote]

  11. #11
    Membre � l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par d�faut
    Et bien je te remecie, je pense avoir fait un grand pas (en tout cas pour moi) concernant les pointeurs.

    Encore merci.

  12. #12
    Membre � l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Par d�faut
    Pour hamster,

    effectivement j'ai cr�e un projet win32 avec une fonction main comme point d'entr�e.

  13. #13
    Membre confirm� Avatar de hamster
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 137
    Par d�faut
    Citation Envoy� par debC++
    Pour hamster,

    effectivement j'ai cr�e un projet win32 avec une fonction main comme point d'entr�e.
    faut cr�er un projet console

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Erreur non comprise
    Par PadawanInPerl dans le forum Interfaces Graphiques
    R�ponses: 3
    Dernier message: 15/06/2012, 13h51
  2. erreur non comprise dans script
    Par lebelfortain1 dans le forum Langage
    R�ponses: 7
    Dernier message: 22/06/2011, 15h29
  3. Pb d'affichage.erreur non comprise
    Par l_seringa dans le forum C++Builder
    R�ponses: 12
    Dernier message: 28/03/2008, 19h25
  4. Erreur non Comprise
    Par Fahmi06 dans le forum Ubuntu
    R�ponses: 1
    Dernier message: 12/03/2008, 17h43
  5. Erreur non comprise
    Par PallBreak dans le forum C++
    R�ponses: 5
    Dernier message: 28/02/2008, 17h10

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