Objekte in STL-Liste speichern funktioniert nur mit tmp. Objekt

Hi.

Endurion hat gesagt.:
Äh, der Kommentar im Code ist falsch:
Das mit operator= ist der Zuweisungsoperator. Es fehlt der Copy-Construktor. Der müsste so aussehen:

TypePoly::TypePoly( const TypePoly &AnotherPolyObject)

und vom Inhalt her dann eigentlich dasselbe tun wie der Zuweisungsoperator.
Das ist falsch. Oder hast du irgendwo einen Copy Constructor definiert? Wo? Wie sieht der aus?

Gruß
 
Wie falsch? Ich hab da nur den Kopf des Copy-Constructors definiert, der Inhalt ist ja im Grunde dasselbe wie beim Zuweisungsoperator. Den da nochmal hinzukopieren habe ich für nicht nötig gehalten, deshalb habe ich da auch noch dazugeschrieben, dass der dasselbe machen sollte.

Einziger Unterschied: Kein Rückgabewert.

So müsste das also aussehen:

Code:
TypePoly::TypePoly(const TypePoly &AnotherPolyObject)
{
        if (this != &AnotherPolyObject)     // Don't copy anobject to itself!
        {
                DeleteAll();
                Closed = AnotherPolyObject.Closed;
                Fill = AnotherPolyObject.Fill;
                Smooth = AnotherPolyObject.Smooth;
                FillColour = AnotherPolyObject.FillColour;
                int NrV = AnotherPolyObject.NrVertices();
                for (int iVert = 1; iVert <= NrV; ++ iVert) {
                        AppendVertex(AnotherPolyObject.Vertex(iVert));
                }
        }
}

Da fällt mir übrigens auf, der Zuweisungsoperator ist falsch: Der müsste ein TypePoly& zurück geben:

Code:
TypePoly& TypePoly::operator=(const TypePoly &AnotherPolyObject)
{
        if (this != &AnotherPolyObject)     // Don't copy anobject to itself!
        {
                DeleteAll();
                Closed = AnotherPolyObject.Closed;
                Fill = AnotherPolyObject.Fill;
                Smooth = AnotherPolyObject.Smooth;
                FillColour = AnotherPolyObject.FillColour;
                int NrV = AnotherPolyObject.NrVertices();
                for (int iVert = 1; iVert <= NrV; ++ iVert) {
                        AppendVertex(AnotherPolyObject.Vertex(iVert));
                }
        }
        return *this;
}
 
Endurion hat gesagt.:
Wie falsch? Ich hab da nur den Kopf des Copy-Constructors definiert, der Inhalt ist ja im Grunde dasselbe wie beim Zuweisungsoperator.

@Endurion: Sorry, ich meinte nicht dich. Ich hab mich nur auf die letzte Nachricht von Atlanx bezogen, wo die Frage war was an seinem ersten Ansatz falsch ist. Da du bereits nach dem Copy Constructor gefragt hattest hab das nur nochmal aufgegriffen weil Atlanx darauf gar nicht reagiert hatte...

Gruß
 
Ok, ich habe jetzt einen CopyKonstruktor:

Code:
TypePoly::TypePoly(const TypePoly &AnotherPolyObject)
{
        if (this != &AnotherPolyObject)     // Don't copy anobject to itself!
        {
                DeleteAll();
                Closed = AnotherPolyObject.Closed;
                Fill = AnotherPolyObject.Fill;
                Smooth = AnotherPolyObject.Smooth;
                FillColour = AnotherPolyObject.FillColour;
                int NrV = AnotherPolyObject.NrVertices();
                for (int iVert = 1; iVert <= NrV; ++ iVert) {
                        AppendVertex(AnotherPolyObject.Vertex(iVert));
                }
        }
}

Einen Zuweisungsoperator (wie heisst der denn auf Englisch?)
Code:
TypePoly& TypePoly::operator = (const TypePoly& AnotherPolyObject)
{
        if (this != &AnotherPolyObject)     // Don't copy anobject to itself!
        {
                DeleteAll();
                Closed = AnotherPolyObject.Closed;
                Fill = AnotherPolyObject.Fill;
                Smooth = AnotherPolyObject.Smooth;
                FillColour = AnotherPolyObject.FillColour;
                int NrV = AnotherPolyObject.NrVertices();
                for (int iVert = 1; iVert <= NrV; ++ iVert)
                {
                    AppendVertex(AnotherPolyObject.Vertex(iVert));
                }
        }
        return *this;
}

Und trotzdem funktioniert das immer noch nicht;
Code:
                    TypePoly MyPolygon_tmp = SubPoly;
                    PolygonList.push_back(MyPolygon_tmp);

Waehrend das schon funktioniert:
Code:
                    TypePoly MyPolygon_tmp;
                    MyPolygon_tmp = SubPoly;
                    PolygonList.push_back(MyPolygon_tmp);
 
Zuletzt bearbeitet:
Zeit für den Debugger! Reindebuggen, vor dem push_back und dann schrittweise durch den Copy-Construktor durchhangeln. Entweder ist der Copy-Construktor nicht sauber oder beim Rausholen aus der Liste geht was kaputt.

Hast du mal versucht, das Struct direkt nach push_back mit PolygonList.back() auszulesen. Sind da die Werte noch intakt?
 
Hi.

Die if-Bedingung im Constructor ist natürlich unnötig. Das Objekt soll gerade erst durch den Constructor erstellt werden und da kann es ja nicht sein, das das gleiche Objekt bereits existert und als Referenz-Parameter übergeben wird.

DeleteAll () ist im Constructor auch unnötig (kann durch SetDefaults() ersetzt werden), das Objekt ist schließlich noch nicht initialisiert und es gibt nichts zu löschen. Du fängst aber fleißig an zu löschen, wo nebenbei bemerkt auch start und mNrVertices noch keinen Wert haben. Reiner Zufall das da noch nix schief geht...

Das der Zuweisungsoperator Operator funktioniert liegt daran, das vorher bereits ein Objekt mit dem Standardkonstruktur erstellt wird und mNrVertices ordentlich initialisiert ist.

Es ist übrigens besser statt Zuweisungen im Konstruktor die Initialisierung in einer Initialisierungsliste zu machen (dafür ist sie schließlich da) - wg. d. Performance und um Doppelinitialisierungen zu vermeiden.

Atlanx hat gesagt.:
Einen Zuweisungsoperator (wie heisst der denn auf Englisch?)
Assignment operator.

Gruß
 
Das ist im uebrigen nicht mein Code und dass das ueberhaupt funktioniert ist mir sowieso ein Raetsel. Aber es funktioniert irgendwie......

deepthroat hat gesagt.:
Das der Zuweisungsoperator Operator funktioniert liegt daran, das vorher bereits ein Objekt mit dem Standardkonstruktur erstellt wird und mNrVertices ordentlich initialisiert ist.

Ah, ja. Jetzt wird mir endlich einiges klar.
Wie kann man nur so einen Code schreiben.... (-_-);
 
Zurück