Zunächst einmal sollte die gültige Antwort sein, dass es keine Möglichkeit gibt, die erste Cat
zu erstellen. Das Beispiel wurde wahrscheinlich nur herausgezogen, um zu demonstrieren, wie ein vom Benutzer deklarierter Konstruktor verhindert, dass der implizit deklarierte Standardkonstruktor deklariert wird.
nun trotz dieser und rein, wenn die Mittel, um die Enden rechtfertigt, gibt es jedoch Möglichkeiten, die erste Katze die Schaffung eines Layout-kompatibel Objekt.
C++ 11 eingeführt Layoutkompatibilität:
Zwei Standard-Layout-Struktur (Ziffer 9) Typen sind Layout-kompatibel, wenn sie die gleiche Anzahl von nicht-statischen Datenelementen und entsprechenden nicht- statische Datenelemente (in der Deklarationsreihenfolge) haben Layout-kompatible Typen (3.9).
Eine Standard-Layout-Klasse ist eine Klasse, die:
- Nicht-Standard-Layout-Klasse (oder Anordnung solcher Typen) oder Referenz, keine nicht-statischen Datenelemente vom Typ
hat
- hat keine virtuellen Funktionen (10.3) und keine virtuellen Basisklassen (10.1),
- die gleiche Zugangskontrolle hat (Abschnitt 11) für alle nicht-statischen Datenelemente,
- keine nicht-Standard-Layout-Basisklassen aufweisen,
- hat entweder keine nicht statischen Datenelemente in der abgeleiteten Klasse und höchstens eine Basisklasse mit nicht statischen Datenmembern oder keine Basisklassen mit nicht statischen Datenmembern, und * hat keine Basisklassen gleicher Typ wie das erste nicht statische Datenelement.
Eine Standard-Layout-Struktur ist eine Standard-Layout-Klasse mit dem Klassenschlüssel definiert struct
oder dem Klasse-Keys class
.
Dies bedeutet, dass Sie tun können:
class Cat {
public:
Cat(const Cat& iCat) : x{iCat.x} {}
int x;
};
class foo {
public:
foo(int x) : m_x{x} {}
int m_x;
};
int main() {
foo f{5};
Cat* c1 = reinterpret_cast<Cat*>(&f);
Cat c2 = *c1;
std::cout << c2.x << std::endl; // 5
}
Die x
und m_x
Mitglieder das Kopieren von (Layout-kompatibel) Mitglieder zu demonstrieren, werden verwendet.
Hinweis: Wie im Kommentar von @M.M erwähnt, müssen Sie möglicherweise das strikte Aliasing in Ihrem Compiler deaktivieren, damit dies funktioniert.
"Kann mir jemand sagen, wie man das erste Cat-Objekt in diesem Fall erstellt?" - Sie können nicht. Also schreibe keinen Code wie diesen. –
Vielleicht war dieses Beispiel nur zur Veranschaulichung? In vernünftigem Code möchten Sie einen zusätzlichen Konstruktor haben, unabhängig davon, ob es sich um einen Standardkonstruktor handelt oder nicht. –
Ich würde vorschlagen, dass Sie mindestens Ihre Klasse mit einem privaten Konstruktor und einer Funktion erweitern müssen, um eine Basisklasse mit einigen vernünftigen Standardwerten zu initialisieren, wenn Sie nicht möchten, dass sie allgemein konstruierbar ist. – Donnie