ongeldig gebruik van niet-statisch gegevenslid

Voor een code als deze:

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

Ik krijg deze foutmelding:

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

momenteel wordt de variabele ageïnitialiseerd in de constructor van foo.

Als ik het statisch maak, staat er:

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

Ik wil echter een waarde doorgeven aan ain de constructor.
Wat is dan de oplossing?


Antwoord 1, autoriteit 100%

In C++, in tegenstelling tot (bijvoorbeeld) Java, behoort een instantie van een geneste klasse niet intrinsiek tot een instantie van de omsluitende klasse. Dus bar::getAheeft geen specifieke instantie van foowaarvan ahet kan retourneren. Ik vermoed dat wat je wilt zoiets is als:

   class bar {
      private:
        foo * const owner;
      public:
        bar(foo & owner) : owner(&owner) { }
        int getA() {return owner->a;}
    };

Maar zelfs hiervoor moet u misschien enkele wijzigingen aanbrengen, omdat in versies van C++ vóór C++11, in tegenstelling tot (wederom, laten we zeggen) Java, een geneste klasse geen speciale toegang heeft tot zijn omsluitende klasse, dus het kan’ t zie het protectedlid a. Dit is afhankelijk van uw compilerversie. (Tip voor Ken Wayne VanderLinde om erop te wijzen dat C++11 dit heeft veranderd.)


Antwoord 2, autoriteit 22%

In C++ zijn geneste klassen niet verbonden met een instantie van de buitenste klasse. Als u wilt dat bartoegang heeft tot niet-statische leden van foo, dan moet bartoegang hebben tot een instantie van foo. Misschien iets als:

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

Of misschien

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

In ieder geval moet je explicietervoor zorgen dat je toegang hebt tot een instantie van foo.


Antwoord 3, autoriteit 7%

De geneste klasse weet niets van de buitenste klasse, en protectedhelpt niet. U moet een feitelijke verwijzing doorgeven naar objecten van het geneste klassetype. Je zou een foo*kunnen opslaan, maar misschien is een verwijzing naar het gehele getal voldoende:

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) { }
};

Je kunt nu innerlijke klassen zoals Inner i(n);instantiëren en i.get()aanroepen.


Antwoord 4

Je probeert toegang te krijgen tot een privélid van de ene klas vanuit een andere. Het feit dat bar-class wordt gedeclareerd binnen foo-class, betekent dat de bar alleen zichtbaar is binnen foo-class, maar dat is nog steeds een andere klasse.

En wat is p->param?

Eigenlijk is het niet duidelijk wat je wilt doen

Other episodes