konstante Klassen definieren.
-
Folgendes Problem: Ich habe eine Klasse T und lege in einem Header spezielle Instanzen von T an:
const T A(1); const T B(2);Aber das geht doch schief, wenn mein Header in verschiedenen .cpp-Files verwendet wird, oder? (Doppelte Instanzierung)
Wie kann ich das retten, ohne auf extern zurückgreifen zu müssen (meine Klasse T ist ein lightweight-Wrappe um ein int, und soll komplett wegoptimiert werden)?
-
Das verletzt dann die ODR, korrekt.
Ob extern oder nicht sollte keine Auswirkung darauf haben ob mehr oder weniger wegoptimiert wird.
-
const impliziert internal linkage, solange du die Objekte nicht explizit extern machst.
-
camper schrieb:
const impliziert internal linkage
Das heißt auf gut Deutsch?
-
Unter der Annahme, dass die Konstanten sowieso in jeder Datei wegoptimiert werden, kannst du sie static const machen oder äquivalent dazu in einen anonymen namespace packen.
-
Weil mir der Titel ins Auge gesprungen ist: Es geht hier um konstante Objekte. Klassen != Objekte.
ujhhkjh schrieb:
Folgendes Problem: Ich habe eine Klasse T und lege in einem Header spezielle Instanzen von T an:
const T A(1); const T B(2);Aber das geht doch schief, wenn mein Header in verschiedenen .cpp-Files verwendet wird, oder? (Doppelte Instanzierung)
Wie kann ich das retten, ohne auf extern zurückgreifen zu müssen (meine Klasse T ist ein lightweight-Wrappe um ein int, und soll komplett wegoptimiert werden)?
Top-Level const impliziert in C++ eine interne Bindung. Es geht also nicht schief, wenn Du diesen Header in mehreren ÜEs einbindest. Allerdings hast du dann pro solcher ÜE zwei eigene Objekte.
(ÜE = Übersetzungseinheit)
Wenn Du das nicht willst, ist der Standardweg der, de Objekte per extern zu deklarieren und sie in einer eigenen ÜE (soundso.cpp) zu definieren. Wenn es unbeding sein muss, dass das alles in einem Header passieren soll, kann man es auch über eine inline-Funktion regeln:
inline T const& a() { static const T meina (1); return meina; }Hier ist garantiert, dass die Funktion von jeder ÜE aus eine Referenz auf dasselbe Objekt zurückgibt. (Das liegt an inline+static)
-
314159265358979 schrieb:
camper schrieb:
const impliziert internal linkage
Das heißt auf gut Deutsch?
Kurzversion:
const int foo = 23; // in C++ist äquivalent zu
static const int foo = 23; // in C(davon abgesehen, dass in C foo kein konstanter Ausdruck ist, aber es geht hier ja um die Bindung)
top-level const im globalen Scope / auf Namensraumebene impliziert interne Bindung -- es sei denn, das Schlüsselwort extern wird verwendet.