2011-01-05 15 views
0

Ich verstehe, wenn ich ein const-Array in einem Klasse-Namespace in C wollen ++ kann ich nicht tun:Statische Konst Initialisiert Structure Array in C++ Klasse

class c 
{ 
private: 
    struct p 
    { 
    int a; 
    int b; 
    }; 
    static const p pp[2]; 
}; 

const c::p pp[2] = { {1,1},{2,2} }; 

int main(void) 
{ 
    class c; 
    return 0; 
} 

ich tun muss:

class c 
{ 
public: 
    struct p 
    { 
    int a; 
    int b; 
    }; 
    static const p pp[2]; 
}; 

const c::p pp[2] = { {1,1},{2,2} }; 

int main(void) 
{ 
    class c; 
    return 0; 
} 

Aber dies erfordert "p" und "pp" sind öffentlich, wenn ich möchte, dass sie privat sind. Gibt es in C++ keine Möglichkeit, private statische Arrays zu initialisieren?

EDIT: ------------------- Danke für die Antworten. Zusätzlich möchte ich, dass diese Klasse eine Bibliothek ist, nur Header-Dateien, die von einem Hauptprojekt verwendet werden können. Wenn die folgenden Initialisierer in mehrere Dateien eingeschlossen werden, führt dies zu Fehlern bei der "Mehrfachdefinition von".

const c::p c::pp[2] = { {1,1},{2,2} }; 

Wie kann ich das lösen?

+0

Zusätzlich zu den tatsächlichen Frage Antworten, in C++ '(void)' ist unnötig und schlechte Praxis, genau wie 'Klasse c' ist nichts. Sie müssen 'int main() {c varname; zurückgeben 0; } ' – Puppy

+0

Danke - warum ist (void) schlechte Praxis? – Sam

+0

(void) schadet nicht, aber auch nicht gut. Es wird aus Gründen der Kompatibilität mit C unterstützt, dies kann sich jedoch in zukünftigen Versionen ändern. – TonyK

Antwort

9

Ihr erstes Code-Snippet funktioniert einwandfrei. Sie müssen es nur ändern:

const c::p c::pp[2] = { {1,1},{2,2} }; 
+1

Als eine Nebenbemerkung wird sein zweites Code-Snippet nicht wie vorgesehen funktionieren. 'c :: pp' bleibt uninitialisiert, während ein' :: pp'-Array erzeugt und initialisiert wird. –

+0

Danke, das funktioniert gut. – Sam

+0

Bearbeitet mit einer anderen Frage :) – Sam

0

Sie pp als mit c:: qualifizieren müssen in

const c::p c::pp[2] = { {1,1},{2,2} };

Ansonsten initialisieren Sie versuchen, ein neues Array auf den globalen Bereich zu definieren, anstatt das Mitglied.

2

Die meiste Zeit sollten Sie nicht private statische Mitglieder haben und aus dem Schnipsel sehe ich, dass dies keine Ausnahme ist.

Stattdessen entfernen Sie die Struktur vollständig aus der Sichtbarkeit und fügen sie und die Instanz in den anonymen Namespace der Kompilierungseinheit ein, in der sich Ihre Klassenfunktionen befinden.

Benutzer der Klasse müssen dann keine Implementierungsdetails sehen.

Eine Ausnahme wäre, wo die Struktur oder eine private statische Member-Funktion Zugriff auf die privaten Mitglieder der Klasse benötigt. Wenn das der Fall ist, musst du zumindest seine Existenz als Freund im Klassenheader deklarieren, damit du nichts wirklich verlierst, indem du es als statisch deklarierst, sobald du es zeigen musst.

+0

Ich bin mir nicht sicher, ob ich Ihre Antwort richtig verstanden habe, aber ich denke, Sie sollten diese statischen Member als lokale Variablen für die CPP-Datei angeben, in der die Funktionen definiert sind. Was ich jedoch tun möchte (wie Sie aus der Bearbeitung sehen können), ist, alle Definitionen in der Header-Datei zu behalten, damit der Compiler einfach optimieren kann. Diese Klasse wird in eine Header-Datei abstrahiert und die const-Arrays müssen noch initialisiert werden. – Sam

+1

Wenn Sie diese in einer Header-Datei haben, wird der Compiler nicht optimiert, aber es kann länger dauern, sie zu kompilieren. – CashCow