6 Stimmen

Kann keinen privaten Methoden in C++ eine Zeiger auf eine private verschachtelte Klasse zurückgeben

Dieser will nicht kompilieren:

class MainClass
{
public:
    ...

private:
    class NestedClass
    { //Linie 39
        ...
    };

    class NestedClass * getNestedClassFor(int i);
};

Der Compiler sagt:

Fehler: 'class MainClass::NestedClass' ist privat

Wenn ich jedoch NestedClass public mache, funktioniert es.

Warum funktioniert es nicht? Es ist nicht so, als ob ich eine verschachtelte Klasse über eine öffentliche Methode exportiere? Es ist nur eine private Methode, die einen Zeiger auf eine private Klasse zurückgibt. Irgendwelche Ideen?

Vielen Dank!

Update

Die Semikolons wurden korrigiert. Sie sind nicht das Problem. Auch das Schreiben von class vor NestedClass ist nicht das Problem.

Hier ist die Fehlermeldung:

MainClass.h: Bei der Funktion 'MainClass::NestedClass* getNestedClassFor(int i)':

MainClass.h:39: Fehler: 'class MainClass::NestedClass' ist privat

MainClass.cpp:49: Fehler: innerhalb dieses Kontextes

Hier ist der Teil der .cpp-Datei, der ebenfalls eine Beschwerde darstellt:

class MainClass::NestedClass * getNestedClassFor(int i) //Linie 49
{
    return NULL;
}

4voto

Albus Dumbledore Punkte 11970

Hatte vergessen, die Klasse scope in der .cpp hinzuzufügen, d.h.

class MainClass::NestedClass * getNestedClassFor(int i)
{
   //...
}

Sollte sein

class MainClass::NestedClass * MainClass::getNestedClassFor(int i)
{
   //...
}

Dumm von mir!

3voto

Pietro Lorefice Punkte 1437

Dies kompiliert und funktioniert einwandfrei:

class A {
private:
    class B {
    public:
        B() {};
    };

    B *b;   
    B *getB();

public:
    A();
};

A::A()
{
    b = getB();
}

A::B* A::getB()
{
    A::B *tmp = new A::B();
    return tmp;
}

int main()
{
    A a;
    return 0;
}

2voto

Pih Punkte 2282

Ein Fehler ist: (Tatsächlich handelt es sich nicht um einen Fehler, sondern eher um ein stilistisches Element; siehe Kommentare unten)

class NestedClass * getNestedClassFor(int i);

sollte nur sein:

 NestedClass * getNestedClassFor(int i);

Ein weiterer Fehler ist: Wenn Sie eine geschachtelte Klasse deklarieren, sollten Sie die Deklaration mit einem ";" abschließen

private:
  class NestedClass
  {
      ...
  };

Es gibt möglicherweise weitere Fehler dort...

1voto

Romanoff Punkte 41

Warum würdest du das tun wollen? Du solltest private Angelegenheiten nicht für externe Kunden offenlegen. Das ist der Sinn von Kapselung. Mache es öffentlich, wenn es von außen erreichbar sein muss.

0voto

LeleDumbo Punkte 9112

Warum funktioniert es nicht? Ich exportiere doch keine verschachtelte Klasse über eine öffentliche Methode? Es handelt sich lediglich um eine private Methode, die einen Zeiger auf eine private Klasse zurückgibt. Irgendwelche Ideen?

Die Compiler-Meldung ist sehr klar. Du gibst einen Zeiger auf eine private verschachtelte Klasse zurück. Der Aufrufer dieser Funktion müsste dann die Struktur dieser Klasse kennen, jedoch ist es aufgrund der Privatsphäre der Klasse nicht gestattet, die Struktur zu erhalten. Du solltest einige der Attribute und Methoden der Klasse privat machen, nicht die Klasse selbst. Selbst dann, wenn du alle Attribute und Methoden privat machst, hätte diese Klasse keine Verwendungsfall.

Was versuchst du überhaupt zu erreichen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X