Die Fehlermeldung besagt eindeutig, dass der Standardkonstruktor implizit gelöscht wurde . Es heißt sogar, warum: Die Klasse enthält eine nicht statische const-Variable, die vom Standard-ctor nicht initialisiert würde.
class X {
const int x;
};
Da dies der Fall X::x
ist const
, muss es initialisiert werden - aber ein Standard-Ctor würde es normalerweise nicht initialisieren (da es sich um einen POD-Typ handelt). Um einen Standard-Ctor zu erhalten, müssen Sie daher selbst einen definieren (und dieser muss initialisiert werden x
). Sie können die gleiche Situation mit einem Mitglied haben, das eine Referenz ist:
class X {
whatever &x;
};
Es ist wahrscheinlich erwähnenswert, dass beide auch die implizite Erstellung eines Zuweisungsoperators aus im Wesentlichen demselben Grund deaktivieren. Der implizite Zuweisungsoperator führt normalerweise eine mitgliederweise Zuweisung durch, aber mit einem const-Mitglied oder Referenzmitglied kann er dies nicht tun, da das Mitglied nicht zugewiesen werden kann. Damit die Zuweisung funktioniert, müssen Sie Ihren eigenen Zuweisungsoperator schreiben.
Aus diesem Grund sollte ein const
Mitglied normalerweise statisch sein. Wenn Sie eine Zuweisung vornehmen, können Sie das const-Mitglied ohnehin nicht zuweisen. In einem typischen Fall haben alle Ihre Instanzen denselben Wert, sodass sie auch den Zugriff auf eine einzelne Variable gemeinsam nutzen können, anstatt viele Kopien einer Variablen zu haben, die alle denselben Wert haben.
Es ist natürlich möglich, Instanzen mit unterschiedlichen Werten zu erstellen. Sie übergeben (zum Beispiel) beim Erstellen des Objekts einen Wert, sodass zwei verschiedene Objekte zwei unterschiedliche Werte haben können. Wenn Sie jedoch versuchen, sie auszutauschen, behält das const-Element seinen ursprünglichen Wert bei, anstatt ausgetauscht zu werden.