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

SL & STL C++ Discussion :

vector et type


Sujet :

SL & STL C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut vector et type
    Bonjour � tous,

    voil�, j'ai encore quelques difficult�s avec le typage, et notamment les const et autres * et &. Pr�sentement, j'ai un soucis avec un vector d�clar� ainsi:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    class MaClasse
    {[...]
    std::vector<Type1*> monvector;
    };
    Dans une m�thode, je re�ois un objet de type Type1* que je dois ins�rer dans mon tableau, et je voudrais faire quelque chose du genre:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void MaClasse::MaMethode(const Type1* pItem)
    {
        monvector.push_back(pItem);
    }
    C'est tout b�te, mais �a ne compile pas. Voila l'erreur:
    cannot convert parameter 1 from 'const class Type1*' to 'class Type1*const & '
    Je ne comprends pas: il y a des *, des & et des const dans tous les sens. Auriez-vous quelques explications?

    merci

  2. #2
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par d�faut
    Salut !

    En fait, le probl�me vient principalement du fait que ton vector contient des "Type1*" et que tu essaies d'y ins�rer un "const Type1*" le const& suppl�mentaire vient simplement du fait de la signature de la fonction push_back ^^

    pour r�soudre ton probl�me, tu as deux choix, un propre, et un pas propre

    le pas propre consiste � faire un const_cast sur ton pointeur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void MaClasse::MaMethode(const Type1* pItem)
    {
        monvector.push_back(const_cast<Type1*>(pItem));
    }
    pas tr�s joli n'est-ce pas

    La seconde consiste simplement � modifier un peu la signature de MaMethode pour qu'elle prenne en param�tre des "Type1*" et non des "const Type1*" :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void MaClasse::MaMethode(Type1* pItem)
    {
        monvector.push_back(pItem);
    }
    C'est d�j� nettement plus propre hein

    J'ai mentionn� le premier cas uniquement parce que je sais qu'il est quelques fois possible de le rencontrer, et qu'on peut parfois passer un petit bout de temp � comprendre pourquoi il est l�
    R�dacteur "�clectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les R�gles du Forum - Mon Site Web sur DVP.com (D�veloppement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne r�pondrai � aucune question technique via MP, MSN ou Skype : les Forums sont l� pour �a !!! Merci de me demander avant de m'ajouter � vos contacts sinon je bloque !
    pensez � la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Salut,

    merci pour ta r�ponse claire, consice et pr�cise. Tu r�ponds � toutes mes questions!! :p

    Cependant, je vais malheureusement �tre contraint d'utiliser la premi�re m�thode que tu proposes, car je n'ai pas le droit de modifier la signature de la m�thode. Il s'agit d'une m�thode h�rit�e... de loin (plusieurs �tapes d'h�ritage), donc "pas touche"

    encore

  4. #4
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par d�faut
    Dans ce cas, ce que je te proposerais, ce serait de rajouter une surd�finition � MaMethode pour avoir quelque chose de ce type :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    inline void MaClasse::MaMethode(const Type1* type1) { this->MaMethode(const_cast<Type1*>(type1)); }
     
    void MaClasse::MaMethode(Type1* type1)
    {
        monvector.push_back(type1);
    }
    �a aurait au moins le m�rite de montrer que tu demandes un "Type1*" et non un "const Type1*"

    par contre m�fit-toi avec ces histoires de pointeurs et de const, Si jamais tu ins�re un objet qui DOIT �tre const dans ton vector et que tu l'utilises ensuite comme n'�tant pas const, cela risque d'entrainer de tr�s graves bugs !

    Je serais toi, j'esseairais plut�t de voir s'il n'est pas possible de faire autrement (par exemple pourquoi pas un vector<const Type1*> ?), parce l�, il y a vraiment de gros risques de bugs selon ce que tu fais apr�s avec les �l�ments de ton vector ...
    R�dacteur "�clectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les R�gles du Forum - Mon Site Web sur DVP.com (D�veloppement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne r�pondrai � aucune question technique via MP, MSN ou Skype : les Forums sont l� pour �a !!! Merci de me demander avant de m'ajouter � vos contacts sinon je bloque !
    pensez � la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par Swo�g
    par contre m�fit-toi avec ces histoires de pointeurs et de const, Si jamais tu ins�re un objet qui DOIT �tre const dans ton vector et que tu l'utilises ensuite comme n'�tant pas const, cela risque d'entrainer de tr�s graves bugs !
    Parfois l'informatique a un c�t� magique. Dans le cas pr�sent, un mot de vient � l'esprit: divination. Serais-tu devin Swo�g? Car en effet, tout content de faire tourner mon bouzin avec le const_cast<>, j'ai obtenu un joli petit bug qui fait tout planter lorsque je ferme la fen�tre sur laquelle je travaille (et qui fait partie d'une MDI avec plein de fen�tres).

    Citation Envoy� par Swo�g
    Je serais toi, j'esseairais plut�t de voir s'il n'est pas possible de faire autrement (par exemple pourquoi pas un vector<const Type1*> ?), parce l�, il y a vraiment de gros risques de bugs selon ce que tu fais apr�s avec les �l�ments de ton vector ...
    J'y ai pens�. Le probl�me, c'est que j'ai vraiment besoin d'effectuer des modifications sur ces objets!

    Sinon, j'ai pens� faire un constructeur de recopie: Type1::Type1(const &Type1){}. Ca devrait marcher non?

  6. #6
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par d�faut
    Citation Envoy� par r0d
    Parfois l'informatique a un c�t� magique. Dans le cas pr�sent, un mot de vient � l'esprit: divination. Serais-tu devin Swo�g? Car en effet, tout content de faire tourner mon bouzin avec le const_cast<>, j'ai obtenu un joli petit bug qui fait tout planter lorsque je ferme la fen�tre sur laquelle je travaille
    Je suis pas devin, mais j'ai d�j� eu � faire avec const_cast, j'ai eu droit � des beaux petits feux d'artifices de segfault (entre autres)

    Le constructeur de copie n'y est pour rien, tu stockes des pointeurs, donc le constructeur de copie ne sera m�me pas appell�... par contre, tu peux tout � fait faire un vector<Type1> mais dans ce cas, tous les �l�ments seront dupliqu�s, et donc tu perdras certains avantages inh�rents aux pointeurs (le fait que tu manipule justement l'objet point� ). Sauf si ta classe Type1 manipule des pointeurs en son sein, auquel cas le constructeur par recopie est OBLIGATOIRE tout comme le destructeur et l'op�rateur = pour �viter des segfaut et autres memoryhole (CF FAQ, mais je sais plus quel article, je crois que �a parle de forme canonique d'une classe ou un truc comme �a moi et la th�orie ^^), ind�pendament du probl�me en cours

    Sinon, je dirais que �a doit relever d'un probl�me de mod�lisation...
    Ne peux-tu couper en deux ton vector ? en mettant d'un c�t� les "const Type1*" et de l'autre les "Type1*" ? N'y a-t-il pas m�prise � un moment dans ta mod�lisation ?

    Car il est tr�s surprenant que �a t'oblige � modifier des �l�ments const...
    R�dacteur "�clectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les R�gles du Forum - Mon Site Web sur DVP.com (D�veloppement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne r�pondrai � aucune question technique via MP, MSN ou Skype : les Forums sont l� pour �a !!! Merci de me demander avant de m'ajouter � vos contacts sinon je bloque !
    pensez � la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #7
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Au contraire rien de magique, tu as un probl�me de conception qui n'a pas 50 solutions. Soit prendre en param�tre ce que tu stockes dans ton vecteur, soit stocker dans ton vecteur ce que tu prends en param�tre. Quoique tu tentes d'autre, ce sera de la bidouille.

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

Discussions similaires

  1. affichier un vector de type cvPoint2D32f
    Par syki.mail dans le forum C++
    R�ponses: 5
    Dernier message: 31/08/2013, 21h40
  2. R�ponses: 11
    Dernier message: 15/02/2011, 17h25
  3. [STL]vector de type compos� et fonction sort
    Par LordBob dans le forum SL & STL
    R�ponses: 14
    Dernier message: 21/03/2007, 11h56
  4. Pb de conversion: double[] vers un vector type???
    Par hycsos dans le forum SL & STL
    R�ponses: 4
    Dernier message: 15/01/2006, 07h59
  5. variable type tableau (vector) statique / constants
    Par Kaktus dans le forum SL & STL
    R�ponses: 5
    Dernier message: 13/10/2005, 22h46

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