C ++: Wie kann eine öffentliche statische Memberfunktion auf private Instanzmitgliedsvariablen zugreifen?

8

Ich schreibe eine C ++ - Klasse, um Eingaben aus einer Datei in vordefinierte Puffer zu lesen, die "Chunks" genannt werden.

Ich möchte, dass der Aufrufer eine öffentliche statische Chunk-Klassenmethode namens GetNextFilledChunk () aufrufen kann, die

  1. Ergreift einen Chunk aus einem inaktiven Chunkpool
  2. Füllt die Chunk-Instanz aus dem Eingabestream mit den privaten Membervariablen / Funktionen des Chunks
  3. Liefert dem Aufrufer einen Zeiger auf den Chunk

Aber Schritt 2 gibt mir Anfälle. Was auch immer ich versucht habe, der Versuch, zu den privaten Mitgliedsvariablen / Funktionen der Chunk-Instanz zu gelangen, verursacht, dass g ++ 4.2.1 Fehler ausgibt.

Hier ist ein Teil der Klassendefinition aus der Header-Datei:

%Vor%

Und hier ist ein Teil der Quelldatei, die das Problem zeigt:

%Vor%

Wie gezeigt, beschwert sich g ++, dass GetNextFilledChunk () versucht, auf ein privates Mitglied von Chunk zuzugreifen.

Dann dachte ich, vielleicht muss es ein "Freund" sein. Aber alles, was ich in Header-Datei versucht habe, GetNextFilledChunk () ein Freund zu machen, führt zu einem Fehler. Zum Beispiel:

Freund statisch Chunk * GetNextFilledChunk ();

führt zu "Chunk.h: 23: warning: 'Chunk * GetNextFilledChunk ()' wurde als 'statisch' deklariert, aber nie definiert"

Was ich wirklich bizarr finde, ist, dass wenn ich GetNextFilledChunk () einfach eine alte Funktion mache, keine statische Memberfunktion, kann ich sie "friend" und jeder ist glücklich. Aber das scheint albern - warum sollte man in der Lage sein, etwas in einer Klasse aus einer Nicht-Klassenfunktion zu machen, die nicht von einer statischen Elementfunktion ausgeführt werden kann?

Also ... Wie kann Chunks GetNextFilledChunk () - Funktion auf private Member-Variablen einer Chunk-Instanz zugreifen?

Und wenn es nicht möglich ist, ist es ein inhärenter Teil von C ++ oder einfach ein Fehler in g ++?

    
Bob Murphy 09.10.2009, 17:05
quelle

5 Antworten

21

Das sieht ein bisschen bizarr aus:

%Vor%

Ist das ein Tippfehler? Sollte es sein:

%Vor%

? Offenbar definieren Sie GetNextFilledChunk versehentlich als einfache Funktion und nicht als Mitglied von Chunk .

    
RichieHindle 09.10.2009, 17:10
quelle
8

Das Problem liegt in Ihrer Definition von GetNextFilledChunk. Wie in der CPP-Datei geschrieben, haben Sie eine Nichtmitgliedsfunktion deklariert, der ein schlecht formatierter Name vorausgeht. Es wird nicht mit der Elementfunktion in der Kopfzeile übereinstimmen.

Die korrekte Signatur ist wie folgt

%Vor%     
JaredPar 09.10.2009 17:10
quelle
7

Sie definieren Ihre Mitgliedsfunktion falsch. Es sollte so definiert werden:

%Vor%

Dass die Definition kompiliert wurde, lag an einer Eigenart der Sprache: Klassennamen werden in ihre eigenen Namespaces eingefügt, sodass Chunk::Chunk äquivalent zu Chunk ist, also haben Sie versehentlich eine globale Funktion definiert.

    
Adam Rosenfield 09.10.2009 17:09
quelle
2

Erstens, wie die anderen bereits erwähnten, ist die Funktionsdefinition falsch. Auch eine Freundesfunktion ist nicht erforderlich, auch sind hier keine Zugriffsbezeichner von Bedeutung, da die Funktion ein Teil der Klasse sein soll und offensichtlich vom Compiler aufgrund der Tippfehler nicht übernommen wird.

Was eine direkte Antwort auf Ihre Frage betrifft: Wie kann eine öffentliche statische Memberfunktion auf private Instanzmitgliedsvariablen zugreifen?

Es kann nicht; Nur nicht statische Memberfunktionen können sowohl auf statische als auch auf nicht statische Variablen zugreifen, und statische Memberfunktionen können nur auf statische Membervariablen zugreifen. Grund: Es ist keine Objektinstanziierung erforderlich, um eine statische Funktion aufzurufen, und daher gibt es keinen this -Zeiger auf eine statische Elementfunktion und damit wiederum kein nicht-statisches Element Variablen für den Zugriff.

    
legends2k 09.10.2009 17:58
quelle
0

Ich denke Singleton-Muster passen dafür sehr gut. Sie können auf alle Arten von Mitgliedsfunktionen zugreifen, ohne sich Sorgen machen zu müssen, wenn Sie von statischen Funktionen darauf zugreifen oder nicht ...

    
VNarasimhaM 09.10.2009 18:12
quelle

Tags und Links