Forum Programmation.c++ error: expected identifier before ‘&’ token

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
3
juil.
2021

Salutations !
Je (re)débute en C++, j'essaye un peu des trucs, et je suis tombé sur une erreur que je comprends pas trop…

le code suivant

class A {

};

class B {
    B(A* a) {

    }
};

class C {
    A a;
    B b(&a);
};

me retourne à la compilation

$ gcc test.cpp 
test.cpp:13:9: error: expected identifier before ‘&’ token
   13 |     B b(&a);
      |         ^

et je comprends pas bien ce qu'il veut… Si quelqu'un peux m'expliquer, merci d'avance :D

  • # Déclaration/Implémentation

    Posté par  . Évalué à 2. Dernière modification le 03/07/21 à 16:59.

    Ici, ton

        class C {
            A a;
            B b(&a);
        };

    est une déclaration de classe et «a» et «b» sont des membres de C. Il n'est donc pas possible de définir leur comportement tout de suite. Le compilo s'attend à un truc du genre:

        class C {
            A a;
            B b;
            C():b(&a) {
               // faire un truc ici
               B b2(&a); // ceci marche aussi ici
            }
        };
    • [^] # Re: Déclaration/Implémentation

      Posté par  . Évalué à 1.

      Ok merci, pas sûr de tout bien piger mais je vais regarder ça de plus près…

    • [^] # Re: Déclaration/Implémentation

      Posté par  . Évalué à 1.

      C'est dimanche matin matin, pas bien réveillé … Je prends le risque de proposer un truc que j'ai pas essayé, changer :

      B b(&a);
      

      en

      B b = &a;
      
      • [^] # Re: Déclaration/Implémentation

        Posté par  . Évalué à 2. Dernière modification le 04/07/21 à 10:41.

        Nope :)

        B n'est pas de type A ;)

        Matricule 23415

        • [^] # Re: Déclaration/Implémentation

          Posté par  . Évalué à 1. Dernière modification le 05/07/21 à 08:19.

          On est lundi matin, et je confirme, j'étais carrément pas réveillé, la vache, c'est moche …

          Mais du coup,

          B b = B(&a);
          

          passe ?

          C'est juste pour voir si je suis mieux réveiller les jours où je bosse …

          • [^] # Re: Déclaration/Implémentation

            Posté par  . Évalué à 1.

            Pas assez réveillé pour l'orthographe/grammaire …

            Mais pas loin, si l'objectif est bien d'avoir un attribut b de classe B dans C. Il manquait un public dans B, sinon, le constructeur est private :

            class A {
            
            };
            
            class B {
                public:
                    B(A* a) {
            
                    }
            };
            
            class C {
                A a;
                B b = B(&a);
            };
  • # Que prend la méthode?

    Posté par  . Évalué à 2.

    Je comprends que tu déclares donc une méthode C::b qui renvoie un B et qui prend un argument nommé a, référence vers un type non fourni ?

    Si tu veux dire que ta méthode C::b prend un argument de type référence vers un A, alors la modification ci-dessous s'impose.

    class C {
        A a;
        B b(A&a);
    };

    Ce code compile, mais l'édition des liens n'est pas garantie (C::b n'est pas définie).
    Et ce n'est pas non plus ce que tu cherches à faire; mais ça, c'est un autre histoire !

  • # non-static data member with initializer (C++11)

    Posté par  (site Web personnel) . Évalué à 2.

    https://en.cppreference.com/w/cpp/language/class

    Ce qui me semble pouvoir être le plus proche de ton code…

    #include <iostream>
    
    class A
    {
        public:
            int i = 5;
    };
    
    class B
    {
        public:
            B( A* a )
            : pa(a)
            {;}
    
            A * pa;
    };
    
    class C
    {
        public:
            B b = B(&a);
    
        private:
            A a;
    };
    
    int main()
    {
        C c;
    
        std::cout << c.b.pa->i << std::endl;
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.