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 :

Probleme lors de la creation d'objet de ma classe avec des paramètres


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut Probleme lors de la creation d'objet de ma classe avec des paramètres
    Bonjour,
    Je tombe sur un problème récurrent et plutot simple mais je ne vois pas pourquoi mon code ne fonctionne pas.
    Donc pour vous expliquer j'ai une classe Point
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Point 
    {
        int x;
        int y;
        public :
          Point (int _x, int _y);
    };
    et une deuxieme classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    classe Droite
    {
        Point A;
        Point B;
        public :
          Droite (Point A, Point B);
    };
    Dans le main j'arrive à creer des objet de ma classe Point mais pas de la classe Droite j'ai cette erreur :
    terminate called after throwing an instance of 'std::logic_error'
    what(): basic_string::_S_construct NULL not valid
    Voici mon main au cas ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main() 
    {
    Point unPointA (5,4);
    Point unPointB(3,5);
    Droite uneDroite(unPointA, unPointB);
    }
    Voila, j'espère que l'exemple que j'ai choisi est clair. A ce que je comprend c'est qu'il cherche un constructeur par defaut, mais je ne vois pas pourquoi?
    Merci

  2. #2
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Le problème n'est pas dans le code que tu nous as montré. Il concerne un string quelque part.
    Pourrait-on avoir tout le code ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 42
    Par défaut
    Dans ton constructeur Droite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Droite (Point A, Point B);
    tu a 2 point en paramètre qui porte le meme nom et qui sont de meme classe que les 2 point qui constitue ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    classe Droite
    {
        Point A;
        Point B;
    je ne sais pas si c'est ça le problème mais dans tous les cas j'éviterais personnellement...

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    salut il me semble que le problème vient du fait que les constructeurs de Point et Droite n'aient pas de corps.
    Et puis oui il faut éviter de donner les mêmes noms.
    Testé sous VS2010 , si le constructeur n'a pas de corps de fonction j'ai une erreur de l'éditeur de lien

    Erreur 1 error LNK2019: symbole externe non résolu "public: __thiscall Point :: Point(int,int)" (??0Point@@QAE@HH@Z) référencé dans la fonction "protected: virtual int __thiscall CtestMFC1Dlg::OnInitDialog(void)" (?OnInitDialog@CtestMFC1Dlg@@MAEHXZ) C:\Users\Documents\Visual Studio 2010\Projects\testMFC1\testMFC1\testMFC1Dlg.obj testMFC1
    Avec ceci ça fonctionne
    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
    class Point 
    {
        int x;
        int y;
        public :
    Point (int _x, int _y){ x=_x;y=_y;};
     
    };
     
    BOOL CtestMFC1Dlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();
     
    Point pt(10,20);
     
     
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Par défaut
    Mat le constructeur d'un objet ne s'écrit pas comme ça en C++. Dans ce que tu as fait tu donnes les valeurs à x et y après la création de l'objet ce qui n'est pas bon.
    Il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Point 
    {
        int x;
        int y;
        public :
     
            Point (int _x, int _y) : x(_x), y(_y){}
     
    };
    Petit point concernant le nom de tes données membres, prends l'habitude de faire commencer leur nom par une majuscule voir mieux comme ceci (plus propre et plus simple à comprendre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Point 
    {
        private :
            int m_X;
            int m_Y;
     
        public :
            Point (int X, int Y) : m_X(X), m_Y(Y){}
            ~Point(){}  // ne pas oublier le destructeur même si il ne fait rien
     
    }; // class Point

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Testé sous VS2010 , si le constructeur n'a pas de corps de fonction j'ai une erreur de l'éditeur de lien
    Euh, le PO montre une erreur runtime...visiblement son code compile donc.
    Par contre, comme souligné par Ekleog, le problème semble venir d'une string, donc il faut chercher ailleurs.

    Nous ne voyons ici que des déclarations de classes, il nous faudrait les implémentations...sans doute y-a-t'il là une construction de string avec un argument null...soit directement soit indirectement

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    salut,
    Alors voila le code exactement. Je voulais juste montrer un exemple clair pour illustrer mon problème.

    la classe Piece
    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
     
    class Piece
    	{
       private:
    		/*
    		 * TODO: Rajouter nom de la piece
    		 */
    	   std::string id;
    	   std::vector<Point> listePoints;
       public:
    	   Piece(const std::string &_id = 0);
     
    	   int addPoint(Point unPoint);
     
    	   std::vector<Point> getPoints () const;
    	   string  getIdPiece() const;
    	   int getIdPoint (Type type);
    	   void affichage ()const;
     
    	   Piece & operator = (const Piece & _piece);
    	};
     
    }
    	Piece::Piece(const std::string &_id):listePoints(0)
    	{
    		id = _id;
    	}
     
    	int Piece::addPeripherique(Point unPoint)
    	{
    		listePoints.push_back(unPoint);
    		return peripheriques.size();
    	}//addunPoint()
     
    	std::vector<unPoint> Piece::getPoints () const
    	{
    		return listePoints;
    	}//getPoints()
     
     
    	int Piece::getIdPoints (Type type)
    	{
    		for(size_t i = 0, size = listePoints.size(); i < size; ++i )
    		{
    			Point& p1 = Point[i];
    			if (p1.getType() == type)
    				return p1.getId();
    		}
    		return -1;
    	}//--getIdPoints()
    	string Piece::getIdPiece() const
    	{
    		return id;
    	}
    	void Piece::affichage() const
    	{
     
    	}
     
    	Piece & Piece::operator = (const Piece &_piece)
    	{
    		id= _piece.getIdPiece();
    		for (size_t i(0); i  <_piece.getPoints().size(); ++i)
    		{
    			this->addPoints(_piece.getPoints()[i]);
    		}
    		return *this;
    	}
    Et mon autre classe:
    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
     
    class Controller {	
    	bool 	mode;
    	double 	echelle;;
    	double 	ecart;
    	Piece	unePiece;
     
      public:
    	Controller(Piece _piece);
     
    	// ---------les getters et les setters----------------------------------
     
    };
     
    Controller::Controller(Piece _piece) {
    	echelle 	= 0;
    	unePiece   = _piece;
    	mode	= true;
            ecart         = 0;   
    }
    le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Piece unePiece ("test");
    	Controller unControle (unePiece);
    J'ai enlevé pas mal de chose pour que ce soit plus claire, je me demande si le problème ne vient pas de l'initialisation de mes vecteurs..
    Merci pour vos réponses

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

Discussions similaires

  1. [JBoss Portal] Probleme lors de la creation du war d'un portail avec Maven
    Par Mageni dans le forum Portails
    Réponses: 1
    Dernier message: 17/11/2009, 10h58
  2. [VBA-E]probleme lors de la creation de feuille
    Par lcoder dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/06/2006, 19h51
  3. Réponses: 2
    Dernier message: 21/04/2006, 15h08
  4. probleme lors de la creation de table
    Par perlgirl dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/11/2005, 09h43
  5. probleme lors de la creation du device
    Par 180degrés dans le forum DirectX
    Réponses: 5
    Dernier message: 18/08/2005, 17h26

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