2016-04-24 14 views
-1

Als eine Zuweisung für meine Programmierklasse, ich schreibe eine Klassendefinition für Floats und dynamische Speicherzuweisung. Wir bauen eine Klasse und verwenden ein Testtreiber-Hauptprogramm, das es ausführt und uns sagt, ob unser Code funktioniert oder nicht. Mein Code für die Klasse ist weit von getan, aber dieses Problem macht mich verrückt und ich kann es nicht herausfinden. Immer wenn der überladene Operator == aufgerufen wird, wird auch mein Kopierkonstruktor aufgerufen. Mein letzter Post, ich habe eine Menge negativer Kommentare bekommen, weil ich zu viel Code gepostet habe, also tue ich mein Bestes, um nur den Code zu schreiben, der benötigt wird, um die Probleme zu sehen.Cant herauszufinden, warum überladene Vergleichsoperator einen Kopierkonstruktor vor der Ausführung ruft

Hier ist meine Spezifikation:

#include <iostream> 
#include <ctype.h> 

using namespace std; 

class MyFloat 
{ 
    enum {DefaultSizeTen=10}; 
    char *Number; 

    int NumberOfDigits; 
    int MaxNumberOfDigits; 

public: 

    ~MyFloat();//destructor 

    MyFloat(const MyFloat & RHS); 
    MyFloat();  //default constructor 
    MyFloat(unsigned int Input); //create any length of MyFloat 

    int Digits(); 
    int MaxDigits(); 

    MyFloat operator= (const char Input[]); 


    int operator== (MyFloat x); 

    MyFloat operator+ (MyFloat x); 
    int operator> (MyFloat x); 
    int operator< (MyFloat x); 

    friend ostream& operator<< (ostream &Out, const MyFloat & X); 
    friend istream& operator>> (istream &In, MyFloat & X); 

}; 

Im Testfahrer, ist dies die Funktion des überladenen Operator == mit:

void TestComparison() 
{ 
    MyFloat A, B, Sum; 


    cout << "\n\n== == == == == Testing \"== \" for MyFloat == == == == == \n\n"; 

    cout << "MyFloat variables have maximum length of " << A.MaxDigits() << endl; 
    do 
    { 
     cout << "\nEnter A ==> "; 
     cin >> A; 
     cout << "\nEnter B ==> "; 
     cin >> B; 

     cout << "\n (A == B) is " << ((A == B) ? "TRUE " : "FALSE ") << endl; 


    } 
    while (SpaceBarToContinue()); 
} 

Es befindet sich auf dieser Linie ist cout << "\n (A == B) is " << ((A == B) ? "TRUE " : "FALSE ") << ends;, dass ich mit meinem Problem. Bevor der überladene Vergleichsoperator aufgerufen wird, wird das RHS zusammen mit einer anderen Variablen in die Copy-Constructor-Funktion gesendet, von der ich nicht weiß, woher sie kommt (in den Copy-Konstruktor als * this). Hier ist der Kopierkonstruktor:

MyFloat::MyFloat(const MyFloat & RHS) 
{ 
    MaxNumberOfDigits=RHS.MaxNumberOfDigits; 
    NumberOfDigits=RHS.NumberOfDigits; 

    Number = new (nothrow) char[RHS.NumberOfDigits+1]; //+1 for overflow 

    if (Number != NULL) 
    { 
     for (int i=0; i<=RHS.NumberOfDigits-1; ++i) 
     { 
      Number[i]=RHS.Number[i]; 
     } 
    } 

    else 
     NumberOfDigits=0; 
} 

Ich weiß nicht, ob dies genug Informationen, aber ich habe einige negative Rückkopplung für die Buchung zu langen Code letztes Mal, so dass ich getrimmt dies ein Bündel nach unten.

+0

Ich bin nur verwirrt, warum der Copykonstruktor auch dann aufgerufen werden. –

Antwort

2

kann nicht herausfinden, warum

von Wert

Sie passieren das Argument eine Kopie Konstruktor vor der Ausführung überlasteten Vergleichsoperator ruft.

int operator== (MyFloat x); 

ändern es zu einer idiomatischen Form:

  1. Ändern der Rückgabetyp bool.
  2. Machen Sie das Argument a const&.
  3. Machen Sie das Mitglied Funktion const Mitglied Funktion.

bool operator==(MyFloat const& x) const; 
+0

OH wow ... daran habe ich noch nie gedacht. Die Tatsache, dass es die überladene Funktion eingibt, weil ich an Wert vorbei gehe, so wird eine Kopie gemacht. Wow, ich fühle mich total albern. Diese Aufgabe hat meine Gedanken so vermasselt, ich erinnere mich nicht an die Grundlagen. Danke vielmals. –

+0

@ joe_04_04, fühle mich nicht so schlecht. Die meisten von uns haben solche Wachstumsschmerzen durchgemacht :) –

+0

@ joe_04_04 - Vor vielen Jahren bat mich einer der führenden Experten in C++, herauszufinden, warum sein Programm abstürzte. Es stellte sich heraus, dass er einen Kopierkonstrukteur geschrieben hatte, der seine Argumentation wertschätzt. Das heißt, das Argument kopieren, das den Kopierkonstruktor aufgerufen hat, der das Argument nach Wert benötigte, also den Kopierkonstruktor usw. –