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 de variable impossible dans un objet en C++ ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut Création de variable impossible dans un objet en C++ ?
    Bonjour,
    je développe en C++ depuis maintenant quelques années et je viens de rencontré une situation que j'avais jamais vu auparavant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "truc.h"
    class tutu
    {
        public:
            tutu();
            virtual ~tutu();
        protected:
        private:
            int ppp = 8;
            truc nananana(5);
    };
    En gros quand je déclare mon objet nananana de type truc, le compilateur crois que je déclare une fonction nommé nananana qui retourne un type truc.
    Du coup je peux pas déclarer de truc en passant des arguments au constructeur de truc, ça ma parait très étrange.
    Suis-je vraiment obligé de faire un pointeur est de l'initialiser dans mon contructor pour faire cela ? (sachant que truc n'est décalable qu'avec argument)

    En faite je sais pas si c'est moi qui ne sais pas faire ou si c'est juste impossible en C++ de faire ça.

    Merci d'avance pour votre aide,
    Matthieu

    PS: je sais que le nom de mes variable c'est du n'importe quoi mais c'était juste pour tester

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Utilise les initialisations avec {}: truc nananana{ 5 };
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    truc nananana = 5; devrait fonctionner aussi.

    On dirait un espèce de https://en.wikipedia.org/wiki/Most_vexing_parse.

  4. #4
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut re
    Merci dragonjoker59, en 2 secondes j'ai l'impression d'avoir tellement appris
    Par contre Ehonn, = 5 ne peut pas fonctionner car nananana n'est pas un int, c'est un objet de type truc qui utilise un int.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sinon, il y a tout simplement la méthode pré-C++11, l'usage d'une liste d'initialisation.

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // tutu.h
    #include "truc.h"
    class tutu
    {
    public:
    	tutu();
    	virtual ~tutu();
    protected:
    private:
    	int ppp = 8;
    	truc nananana;
    };

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // tutu.cpp
    #include "tutu.h"
     
    tutu::tutu()
     : nananana(5)
    {
    }
     
    tutu::~tutu()
    {
    }

    Indispensable si on veut que la valeur vienne d'un paramètre du constructeur, par exemple:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // tutu.h
    #include "truc.h"
    class tutu
    {
    public:
    	tutu(int param);
    	virtual ~tutu();
    protected:
    private:
    	int ppp = 8;
    	truc nananana;
    };

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // tutu.cpp
    #include "tutu.h"
     
    tutu::tutu(int param)
     : nananana(param)
    { }
     
    tutu::~tutu() { }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Matthieu76 Voir le message
    Merci dragonjoker59, en 2 secondes j'ai l'impression d'avoir tellement appris
    Par contre Ehonn, = 5 ne peut pas fonctionner car nananana n'est pas un int, c'est un objet de type truc qui utilise un int.
    Ça fonctionne s'il existe un moyen de convertir implicitement un int en truc. Comme dans cet exemple C++11 :
    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
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -Ofast -std=c++14 -pedantic -fopenmp main.cpp -o main && ./main
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -Ofast -std=c++11 -pedantic -fopenmp main.cpp -o main && ./main
     
    #include <iostream>
     
    class truc
    {
    private:
     
    	int m_i;
     
    public:
     
    	truc() : m_i(0) { }
     
    	truc(int const i) : m_i(i) { }
     
    	int i() const { return m_i; }
    };
     
    class tutu
    {
    public:
     
    	truc t = 5;
    };
     
    int main()
    {
    	std::cout << tutu().t.i() << std::endl; // 5
     
    	return 0;
    }

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/06/2008, 09h00
  2. Création d'une variable vide dans BO
    Par atoffoli75 dans le forum Deski
    Réponses: 5
    Dernier message: 10/06/2008, 09h32
  3. création nouvelle variable dans table existante
    Par meuah dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 16/05/2008, 10h00
  4. variable de session dans un objet
    Par ben53 dans le forum Langage
    Réponses: 4
    Dernier message: 24/01/2007, 17h51
  5. probleme de création de variable dans une boucle
    Par misterweb dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2007, 19h21

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