Das Problem ist doch eher, dass C++ dich nicht auf einen kanonischen Weg festlegt.Jonathan hat geschrieben: ↑08.05.2021, 02:02Ich hatte eine Klasse, die man ursprünglich nicht kopieren konnte. Brauchte ich aber auch nicht, alles lief super. Dann wollte ich an einer Stelle aber doch mal ein Objekt davon kopieren. Also flugs einen copy-ctor eingefügt. Zack, Programm stürzt an einer ganz anderen Stelle ab.
Siehst du? Du hast C mit C++ vermischt. Hättest du die Dinger mit std::make_shared() angelegt und als std::vector<std::shared_ptr<T>> gespeichert, wäre das alles nicht passiert.denn an anderer Stelle habe ich Zeiger auf Inhalte dieser Objekte gespeichert, deshalb darf ich keine tiefe Kopie machen, sondern Objekte nur moven.
Wie es gedacht ist: Du brauchst keinen Copy-Ctor „einfügen“. Den kann der Compiler für dich erzeugen. Und den Move-K’tor auch. Das setzt aber voraus, dass alles, was du in deiner Klasse benutzt, rekursiv den Copy- und Move-Regeln entspricht. Tun auch alle Container und Hilfsklassen der Standardbibliothek.
Aber das darf C++ nunmal nicht erzwingen, sonst schreien alle, dass C++ kein zweites Java/C# sein soll. Dann wäre der Jammer-Thread halt voll von „warum lässt C++ mich nicht einfach irgendwie die Adresse dieses Objekts speichern“.
(Ich verabscheue das moderne C++, aber ich muss eben auch zugeben, dass es ein vergleichsweise konsistenter Kosmos ist. Wenn man anfängt, selber Ressourcen zu verwalten, kommt man halt in die Hölle aus 78 Arten von K’toren, von der du sprichst. Dann bleib eben bei C mit POD und Raw Pointers, tu ich ja auch.)