gelöschter Default- Kopierkonstruktor (C2280)

Schnelle objektorientierte, kompilierende Programmiersprache.
win8789
Beiträge: 25
Registriert: So Mai 29, 2016 12:27 pm

gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von win8789 » So Jun 12, 2016 10:27 am

Hallo,
mir ist es schon öfters Passiert, dass ich den Fehler "C2280: "test::test(const test &)" : Es wurde versucht, auf eine gelöschte Funktion zu verweisen"" bekommen habe. Wenn ich nun in der "test" Klasse einen eigen Kopierkonstruktor schreibe funktoniert es wieder.
Die Frage ist: Warum?
Wird nicht normalerweise immer ein Default-Kopierkonstruktor vom Compiler hergestellt? Das selbe Problem gilt auch für den Zuweisungsoperator.
Um das Poblem zu lösen müsste ich so immer selbst den Konstruktor schrieben, obwohl er nur das selbe wie der Default-Kopierkonstruktor machen soll.

Mir ist es leider nicht gelungen, dass Problem zu extrahieren und es in kleiner Form hier zu Posten, da es in kleinerer Form nicht auftretten will :roll: . Der Fehler kommt oft bei Qt vor, wenn ich mehrere Klassen habe, die gegenseitige Instanzen von sich haben (Beispiel: a hat eine Liste von Instanzen von b, b hat einen Zeiger auf a) und wenn ich listen oder vectoren verwende und im Konstruktor des einen (z.B a) ein Objekt von b mit .push_back einfüge.
Obwohl ich glaube, dass das letzter nicht das Problem, sondern das Symptom, ist, da durch .push_back einfach der gelöschte Kopierkonstruktor aufgerufen wird und dadurch die Fehlermeldung erscheit.

Wenn mir jemand das Problem erklären könnte und mir sagen könnte, wie ich es umgehen kann, wäre ich sehr dankbar.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von Xin » So Jun 12, 2016 10:58 am

win8789 hat geschrieben:Hallo,
mir ist es schon öfters Passiert, dass ich den Fehler "C2280: "test::test(const test &)" : Es wurde versucht, auf eine gelöschte Funktion zu verweisen"" bekommen habe. Wenn ich nun in der "test" Klasse einen eigen Kopierkonstruktor schreibe funktoniert es wieder.
Die Frage ist: Warum?
Weil Du einen anderen Konstruktor geschrieben hast.
win8789 hat geschrieben:Wird nicht normalerweise immer ein Default-Kopierkonstruktor vom Compiler hergestellt?
Ein Name wird aus dem Namensraum der Klasse gelöscht, sobald Du einen eigene Fassung erstellst. Das gilt insbesondere dann, wenn Du ableitest: Die abgeleiteten Funktionen gleichen Namens werden gelöscht, wenn Du eine eigene Version schreibst. Du musst Sie dann (per using) wieder in den Namensraum der Klasse holen.

Im Falle des Konstruktors beschreibst Du (ab C++11), dass Du die Default-Implementierung haben möchtest:

Code: Alles auswählen

class Test
{
  public:
    Test( Test const & ) = default;
    Test() {};  // eigene Implementation überschreibt default

    Test & operator = ( Test const & rhs ) = default;
    Test & operator = ( int rhs ) {};  // eigene Implementation überschreibt default
};
Wunderte mich schon, wo Du wieder abgeblieben bist. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

win8789
Beiträge: 25
Registriert: So Mai 29, 2016 12:27 pm

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von win8789 » So Jun 12, 2016 11:17 am

Ok, aber warum wird der Default- Kopierkonstruktor gelöscht, wenn ich einen Standart-Konstuktor herstelle und wie bekomme ich den gelöschten Default- Kopierkonstruktor wieder in den Namensraum?
weil mit

Code: Alles auswählen

test( test const & ) = default;
funktioniert es ja nicht.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von Xin » So Jun 12, 2016 11:21 am

win8789 hat geschrieben:Ok, aber warum wird der Default- Kopierkonstruktor gelöscht
Wie ich schon schrieb: Der Name wird überschrieben und C++ nimmt vorsichtshalber alle Varianten raus. Wenn Du was brauchst kannst Du Dich melden - aber nicht, wenn was zuviel ist.
win8789 hat geschrieben:wenn ich einen Standart-Konstuktor herstelle und wie bekomme ich den gelöschten Default- Kopierkonstruktor wieder in den Namensraum?
weil mit

Code: Alles auswählen

test( test const & ) = default;
funktioniert es ja nicht.
Müsste abba.

Anders formuliert: Warum funktioniert es bei Dir nicht?

(Fehlermeldung? Welche Compiler-Version?)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

win8789
Beiträge: 25
Registriert: So Mai 29, 2016 12:27 pm

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von win8789 » So Jun 12, 2016 11:41 am

Compiler: Microsoft Visual C++ Compiler 14.0 (amd64)

Qt-Version: Qt 5.6.0 MSVC2015 64bit

Debugger: GDB ...\MinGW\bin\gdb.exe

obwohl es egal ist, ob ich einen Debugger eingestellt habe oder keinen habe. Funktoniert beides genauso gut.

Ich muss zugeben, dass ich mich mit Compiler einrichten und so nur sehr schlecht auskenne.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von Xin » So Jun 12, 2016 12:32 pm

win8789 hat geschrieben:Compiler: Microsoft Visual C++ Compiler 14.0 (amd64)
Debugger: GDB ...\MinGW\bin\gdb.exe
Das ist auch eine ... interessante Kombination. Ich denke, wenn man mit dem Microsoft-Compiler kompiliert, sollte man nicht auf den MinGW-Debugger zurückgreifen.



Ich habe das eben mal kurz ausprobiert und der GCC bei mir wirft den Copy-Construktor gar nicht raus. Nur der Default-Construktor wird rausgeworfen, wenn man Copy überschreibt.

Ich bräuchte entsprechend etwas Quelltext von Dir.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

win8789
Beiträge: 25
Registriert: So Mai 29, 2016 12:27 pm

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von win8789 » So Jun 12, 2016 6:20 pm

Xin hat geschrieben:
win8789 hat geschrieben:Compiler: Microsoft Visual C++ Compiler 14.0 (amd64)
Debugger: GDB ...\MinGW\bin\gdb.exe
Das ist auch eine ... interessante Kombination. Ich denke, wenn man mit dem Microsoft-Compiler kompiliert, sollte man nicht auf den MinGW-Debugger zurückgreifen.



Ich habe das eben mal kurz ausprobiert und der GCC bei mir wirft den Copy-Construktor gar nicht raus. Nur der Default-Construktor wird rausgeworfen, wenn man Copy überschreibt.

Ich bräuchte entsprechend etwas Quelltext von Dir.
Ok ich jetzt mal den Compiler getauscht

Compiler: MinGW 4.9.2 32bit

Debuuger GNU gdb 7.8 for MinGW 4.9.2 32bit

Qt Version: Qt 5.6.1 MinGW 32bit

habe jetzt aber ein mehrer neue Fehlermedlungen die was mit my_pixel( my_pixel const & ) = default;
zu tuhen haben.

Hab das projekt und einen Screenshot mit den Fehlermeldungen auf meinen TortoiseSVN Server hochgeladen.

win8789
Beiträge: 25
Registriert: So Mai 29, 2016 12:27 pm

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von win8789 » So Jun 12, 2016 8:18 pm

edit: Das Programm ist natürlich noch lange nicht fertig

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von Xin » Mo Jun 13, 2016 1:11 pm

win8789 hat geschrieben:Hab das projekt und einen Screenshot mit den Fehlermeldungen auf meinen TortoiseSVN Server hochgeladen.
In ein Repository kommen nur Daten, die man nicht durch Kompilieren erzeugen kann - und die etwas dauerhaftes mit dem Projekt zu tun haben. Heißt: Keine Screenshots, die nur kurzzeitig verwendet werden.
Kopiere den Text hier rein.

Ansonsten wäre eine vcxproj nett. ^^


Mein Visual Studio 2015 ist dank Fortran etwas ramponiert... es weigert sich neue Projekte anzulegen.
Ansonsten muss man auch noch QT installieren... es wäre gut zu wissen, was man alles machen muss, um das Projekt soweit zu bekommen und dass man keine eigene Windows-Lizenz für einen Test braucht, weil man sich das eigene System nicht gleich zumüllen will und das ganze auf einer VM machen möchte.

Darf ich kurz zu Linux raten.



Aber zu Deinem Problem: Wenn du die Fehlermeldung liest, dann ist ein default-Konstruktor nicht möglich, weil QGraphicsTextItem keinen Copy-Construktor besitzt, der default-Konstruktor diesen offenbar also nicht rufen kann, womit der automatisch erzeugte wohl nicht funktioniert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

win8789
Beiträge: 25
Registriert: So Mai 29, 2016 12:27 pm

Re: gelöschter Default- Kopierkonstruktor (C2280)

Beitrag von win8789 » Mo Jun 13, 2016 5:58 pm

Xin hat geschrieben: Aber zu Deinem Problem: Wenn du die Fehlermeldung liest, dann ist ein default-Konstruktor nicht möglich, weil QGraphicsTextItem keinen Copy-Construktor besitzt, der default-Konstruktor diesen offenbar also nicht rufen kann, womit der automatisch erzeugte wohl nicht funktioniert.
Ok danke, jetzt versteh ich wo das Problem liegt.
Allerdings weiß ich immer noch keinen einfachen Lösungsweg. Die Idee, die ich hätte wäre: Verben (my_QGraphicsTextItem) und dann selber einen Copy-Construktor für my_QGraphicsTextItem schreiben.

edit: oder ich schreibe einfach den my_pixel copy Construktor neu

Xin hat geschrieben: Darf ich kurz zu Linux raten.
Tatsächlich hat mir ein Verwandter auch schon dazu geraten mich mit Linux/Unix auseinander zusetzten (der selber Verwandter der mir damals das Buch: "C++ -Einführung und professionelle Programmierung" von Ulrich Breymann ausgeliehen hat und damit den Stein erst zum Rollen gebracht hat^^) jedenfalls, glaube ich, dass ich momentan zu wenig Zeit und zu wenige Nerven habe Linux zu lernen. Naja hab noch Zeit und ich will mich erstmal auf C++ fixieren :D

Antworten