2017-12-29 5 views
-2

Das Ziel ist einfach, ich habe eine Rectangle Klasse mit Breite, Höhe und Flächeneigenschaften. Ich habe eine Operator-Überlastung für den Operator < gemacht, wie das std::sort für seine Vergleiche verwendet.std :: sort bewegt nicht die Elemente eines Vektors

Basierend auf dem, was ich bisher online gefunden habe, scheint es, dass dieses Problem oft davon herrührt, dass etwas im Kopieroperator oder Konstruktor für eine Klasse falsch ist.

Hier ist meine Kopie Konstruktor für die Rectangle Klasse:

Rectangle::Rectangle(const Rectangle & other) 
{ 
    m_width = other.m_width; 
    m_height = other.m_height; 
    m_area = other.m_area; 
} 

Und meine Kopie Operator hier:

Rectangle & Rectangle::operator=(const Rectangle & rhs) 
{ 
    if (this != &rhs) 
    { 
     m_width = rhs.m_width; 
     m_height = rhs.m_height; 
    } 
    return *this; 
} 

Hier ist der < Betreiber:

bool Rectangle::operator<(const Rectangle & rhs) 
{ 
    return (m_area > rhs.m_area); 
} 

Und schließlich , so nenne ich die Sortiermethode, nur für den Fall:

// rects is a vector<Rectangle> with several rectangles in it 
std::sort(rects.begin(), rects.end()); 

Ich denke, dass ich alles richtig mache, aber jede Hilfe wird geschätzt!

+0

Sie lassen den Compiler die Konstruktion und Zuweisung von Kopien für Sie implementieren. Es ist weniger wahrscheinlich, dass triviale Fehler eingeführt werden. – juanchopanza

+6

Warum kopieren Sie den Bereich in Ihrem Zuweisungsoperator nicht? – Galik

+0

Ihr Problem kann nicht aus diesen Snippets reproduziert werden => keine Hilfe –

Antwort

1

Ihr Vergleich verwendet nur die m_area - wie @Galik wies darauf hin, Sie sind nicht, dass in Ihrem „Kopie Operator“ -Einstellung. Es ist also nicht initialisiert und "gleich" für alle Zuweisungs-konstruierten Instanzen - daher keine Sortierung.

Je nachdem, wie Sie Ihre Beispieldaten erstellen, haben alle einen nicht initialisiertenm_area.

Fix es etwa so:

Rectangle & Rectangle::operator=(const Rectangle & rhs) 
{ 
    if (this != &rhs) 
    { 
     m_width = rhs.m_width; 
     m_height = rhs.m_height; 
     m_area = rhs.m_area; // FIX 
    } 
    return *this; 
} 

@Juanchopanza wies darauf hin, dass die automatisch generierten Implementierungen verwenden diese korrekt auf theire selbst behandeln würde, also wenn keine unter Druck Umstände Sie führen diese selbst Implementierung, die beide zu entfernen.

+3

Der eigentliche Fix ist wahrscheinlich * nicht * implementieren Kopie und Zuweisung. – juanchopanza

+0

@juanchopanza stimmte zu - oder repariere es –

Verwandte Themen