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.
Ich bin nur verwirrt, warum der Copykonstruktor auch dann aufgerufen werden. –