58 votes

utilisation non valide d'un membre de données non statique

Pour un code comme celui-ci :

 class foo {
  protected:
    int a;
  public:
    class bar {
      public:
        int getA() {return a;}   // ERROR
    };
    foo()
      : a (p->param)
};

J'obtiens cette erreur :

  invalid use of non-static data member 'foo::a'

actuellement la variable a est initialisée dans le constructeur de foo .

si je le rend statique, alors il dit:

  error: 'int foo::a' is a static data member; it can only be initialized at its definition

Cependant, je souhaite transmettre une valeur à a dans le constructeur. Quelle est la solution alors?

10voto

En C++, les classes imbriquées ne sont connectées à aucune instance de la classe externe. Si vous voulez que bar accède aux membres non statiques de foo , alors bar doit avoir accès à une instance de foo . Peut-être quelque chose comme :

 class bar {
  public:
    int getA(foo & f ) {return foo.a;}
};

Ou peut-être

 class bar {
  private:
    foo & f;

  public:
    bar(foo & g)
    : f(g)
    {
    }

    int getA() { return f.a; }
};

Dans tous les cas, vous devez vous assurer explicitement que vous avez accès à une instance de foo .

4voto

Kerrek SB Points 194696

La classe imbriquée ne connaît pas la classe externe et protected n'aide pas. Vous devrez passer une référence réelle aux objets du type de classe imbriquée. Vous pouvez stocker un foo* , mais peut-être qu'une référence à l'entier suffit :

 class Outer
{
    int n;

public:
    class Inner
    {
        int & a;
    public:
        Inner(int & b) : a(b) { }
        int & get() { return a; }
    };

    // ...  for example:

    Inner inn;
    Outer() : inn(n) { }
};

Vous pouvez désormais instancier des classes internes telles que Inner i(n); et appeler i.get() .

0voto

Alecs Points 642

Vous essayez d'accéder au membre privé d'une classe à partir d'une autre. Le fait que bar-class soit déclaré dans foo-class signifie que bar n'est visible qu'à l'intérieur de la classe foo, mais c'est toujours une autre classe.

Et qu'est-ce que p->param ?

En fait, ce que tu veux faire n'est pas clair

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X