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 a
geï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 a
in 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::getA
heeft geen specifieke instantie van foo
waarvan a
het 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 protected
lid 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 bar
toegang heeft tot niet-statische leden van foo
, dan moet bar
toegang 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 protected
helpt 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