Static Const Initialisiert Struktur-Array in C++ - Klasse
Ich verstehen, wenn ich eine const-array in eine Klasse namespace in C++ kann ich aber nicht:
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;
}
Muss ich tun:
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, dass "p" und "pp" werden öffentliche, wenn ich will, dass Sie private. Gibt es keine Möglichkeit in C++ zu initialisieren private static arrays?
BEARBEITEN: -------------------
Vielen Dank für die Antworten. Darüber hinaus möchte ich diese Klasse in eine Bibliothek, header-Dateien, die nur für ein Hauptprojekt. Einschließlich der folgenden initialiser Ergebnisse in "mehrfach definiert" Fehler beim enthalten von mehreren Dateien.
const c::p c::pp[2] = { {1,1},{2,2} };
Wie kann ich dieses Problem lösen?
- Zusätzlich zu der eigentlichen Frage Antworten, die in C++
(void)
ist unnötig und schlechte Praxis, wieclass c
ist nichts. Sie müssenint main() { c varname; return 0; }
- Danke - warum (void) schlechte Praxis?
- (void) schadet nicht, aber es tut nicht jedem gut. Es wird unterstützt, um die Kompatibilität mit C, aber dies kann sich in zukünftigen Versionen ändern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre ersten code-snippet funktioniert einwandfrei. Sie brauchen nur, um es zu ändern:
c::pp
bleibt nicht initialisiert, während ein::pp
array erstellt und initialisiert.Meisten der Zeit, die Sie nicht haben sollte private static Mitglieder und aus dem snippet-ich sehe, dies ist keine Ausnahme.
Stattdessen, entfernen Sie die Struktur von Sichtbarkeit insgesamt, indem es und die Instanz in die anonymous-namespace der compilation unit, wo Sie Ihre Funktionen Klasse sind.
Benutzer der Klasse ist dann nicht nötig, um zu sehen, detail.
Eine Ausnahme wäre, wenn die Struktur oder einer privaten statischen member-Funktion benötigt Zugriff auf die privaten Elemente der Klasse. Wenn das der Fall ist, müssen Sie zumindest erklären, seine Existenz als einen Freund in der Klasse header, so verlieren Sie wirklich nichts, indem er erklärt es statisch, sobald Sie haben, um zu zeigen, er ist ja sowieso da.
Müssen Sie qualifizieren
pp
mitc::
wie inconst c::p c::pp[2] = { {1,1},{2,2} };
Sonst bist du versucht, definieren Sie ein neues array, in das Globale scope anstelle der Initialisierung der member.