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 :

re-initialiser un objet...oui je suis une newbie


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 315
    Points : 105
    Points
    105
    Par défaut re-initialiser un objet...oui je suis une newbie
    Bonjoour tous, je suis une newbie de c++ et je croyais faire une simple opération en faisant 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
     
    #include "coord.h"	// For coord
     
    static Coord2D FuelPos[2];
     
     
    static void AI (const TankAIInput  in, TankAIInstructions & out)
    {
    FuelPos[indice]=position;
     
    }
     
    static void reset()
    {
    	amIStuck[0] = amIStuck[1] = false;
    	FuelPos[0]=FuelPos[1]=new Coord2D();
    }
    ça me donne cette erreur:
    error C2679: binary '=' : no operator found which takes a right-hand operand of type 'Coord2D *' (or there is no acceptable conversion)

    dans ma ccoord.h j'ai mas strucutre coord2d avec aussi ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline Coord2D operator=(const Coord2D& c)
    	{
    		x = c.x;
    		y = c.y;
    		return *this;
    	}
    est ce que c'Est à cause de ça mon erreur?
    mais si je fais çadans reset():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	FuelPos[0].operator =(new Coord2D());
    ça me donne ceci comme erreur
    error C2664: 'Coord2D::operator`='' : cannot convert parameter 1 from 'Coord2D *' to 'const Coord2D &'
    vous auriez pas une idée de l'erreur que je fais?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Si. Tu melanges pointeurs et references. Rassure toi c'est normal au debut, c'est pas evident.

    Sans te faire un cours (tu peux faire des recherches la dessus sur le net si ca t'interesse) :

    Ton operateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline Coord2D operator=(const Coord2D& c)
    prend une référence en parametre. C'est quoi ? Ben dis toi qu'une reference, c'est exactement comme un objet pour faire plus simple.

    Or toi quand tu appeles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FuelPos[0].operator =(new Coord2D());
    , l'operateur new te retourne un pointeur, c'est a dire l' adresse d'un objet, alors que ton operateur veut l'objet lui meme. Tu saisis la nuance ?

    Bon comment faire ? Et bien c'est simple, soit tu fais un operateur = qui prend des Coord2D* en parametre au lieu des Coord2D&, et qui recopie les champs comme il faut, sois tu utilises * pour dereferencer le pointeur obtenu avec new. C'est du chinois non ?
    Un peu de code pour expliquer tout ca :

    myClass.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
     
    #include "myClass.h"
     
             myClass::myClass()
             {
                               toto='a';
                               }
     
     
     
             myClass::myClass(const myClass& c) {
                          toto=c.toto;
                          }
     
     
     myClass::myClass(const myClass* c) {
                          toto=c->toto;
                          }
     
     !
    myClass.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
     
    #ifndef MY_CLASS_H
    #define MY_CLASS_H
     
    class myClass {
          public :
     
                 char toto;
     
                 myClass();
                 myClass(const myClass& c);
                 myClass(const myClass* c);
     
          } ;
     
     
     
     
    #endif // MY_CLASS_H
    main.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
    #include <cstdlib>
    #include <iostream>
    #include "myClass.h"
     
    using namespace std;
     
     
     
    int main(int argc, char *argv[])
    {
     
        myClass* myClassPtr=new myClass;
        myClass* myClassPtr2=new myClass;
     
        myClass myClassInstance=*myClassPtr;
        myClass myClassInstance2=myClassPtr2;
     
     
        cout << myClassInstance.toto << endl;
        cout << myClassInstance2.toto << endl;
     
        delete myClassPtr;
        delete myClassPtr2;    
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }


    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myClass myClassInstance=*myClassPtr;
    appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     myClass(const myClass& c);
    car *myClassPTr, represente la valeur pointee par myClassPtr

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myClass myClassInstance2=myClassPtr2;
    , elle, appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     myClass(const myClass* c);
    car myClassPtr2, represente un pointeur !!

    C'est subtil, mais super important comme nuance.

    Enfin dernier truc :
    Ne fais jammais myClassInstance=new myClass;

    En effet, tout new doit etre associe a un delete . C'est une regle fondamentale. Quand tu fais un new, tu crees un objet, qui occupe de la memoire. Il te faut donc liberer toi meme cette memoire, sous peine d'avoir des memory leaks. Bon si tu comprends pas, accepte ca comme une regle fondamentale, un new = un delete.
    Or pour faire delete, il te faut avoir quelque chose a deleter.

    OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     myClass a=new myClass;
    myClass b=a;
    delete a;
    pas OK :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myClass b=new myClass;
    delete  ???;
    Dans le 2eme cas je delete quoi ????

    BOn voila, j'ai fait ma bonne action de la journée. En espererant t'avoir aide

    Un solution plus simple sinon : programme en Java

    Bonne chance

  3. #3
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Si le C++ lui est imposé, c'est ptet pas forcément la meilleure solution d'utiliser Java [troll]Et puis il me semble que Java est plus lent à l'exécution que le C++[/troll]
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par nicolas66
    [troll]Et puis il me semble que Java est plus lent à l'exécution que le C++[/troll]
    Hzehe j'adore ce genre de debat a la con !!
    Moi je dirai simplement que pour developper une application serieuse, avec le pognon que tu economises sur le temps de developpement et les efforts de maintenance en faisant du Java, tu peux te permettre d'acheter le matos pour que ca aille a la meme vitesse. Mais bon je te parle d'un contexte pro la ;-)

    Et puis pour la difference de vitesse, d'abord c'est plus aussi vrai qu'il y a quelque années, et en plus, ca depend ce que tu fais ...

  5. #5
    Membre habitué Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Points : 146
    Points
    146
    Par défaut
    Rhô faut pas le prendre comme ca. Je voulais simplement taquiner un petit peu. C'était du second degré
    Athlon 6000+ Dual Core & GeForce 8600 GT -- Ubuntu Gutsy

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Non ! Tu as insulté Java, tu dois mourir ....

Discussions similaires

  1. Initialisation d'objet à partir d'une liste
    Par Rora1636 dans le forum Général Python
    Réponses: 11
    Dernier message: 19/04/2015, 11h55
  2. Réponses: 10
    Dernier message: 13/09/2006, 09h13
  3. Tester si une popup est ouverte si oui en ouvrir une autre
    Par Prue dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 17/08/2005, 09h32
  4. Cherche un objet un peu comme une TStringList
    Par Desraux dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2004, 14h04
  5. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12

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