2016-04-17 20 views
1

Ich versuche, ein dynamisches Array von Zeigern zu einer Anzahl von Instanzen einer Klasse ElectricityBill zu erstellen.Dynamisches Array von Klassenzeigern

Mein aktueller Ansatz besteht darin, ein dynamisches Array von ElectricityBills (derzeit mit nichts) zu erstellen, dann eine einzelne Instanz einer ElectricityBill zu erstellen, eine weitere Reihe von ElectricityBills zu erstellen, diesmal größer, alle Instanzen des alten dynamischen Arrays zu kopieren über, fügen Sie das neue am Ende hinzu.

Der Code von dem, was ich versucht habe, ist unter

// Define the dyn array 
int EBcount = 0; 
ElectricityBill **EB = new ElectricityBill*[EBcount]; 

// Create a temp instance and input the data 
ElectricityBill *tempEB = new ElectricityBill; 
std::cin >> *tempEB; 

std::cout << *tempEB << std::endl; 

// Create a new dyn array and copy the instances accross 
EBcount++; 
ElectricityBill **temp = new ElectricityBill*[EBcount]; 
for (int i = 0; i < EBcount-1; i++) { 
    temp[i] = EB[i]; 
} 

// Append the new instance at the end and delete the old array 
temp[EBcount-1] = tempEB; 
delete [] EB; 
EB = temp; 

std::cout << temp[0] << std::endl; 
std::cout << EB[0] << std::endl; 

und der Ausgang ist

E;name;1;2;3;acc;add;1/1/2000;1/2/2000;22.721;2.2721 
0x100500000 
0x100500000 

Es erwähnenswert ist, dass ich die Betreiber << und >> innerhalb der Klassendefinition überlastet haben. Der >> Operator fordert den Benutzer auf Daten und speichert Eingangsdaten innerhalb der Klasse des privaten Bereich von Variablen einzugeben, und die << Operator wie so gebaut:

std::ostream& operator<<(std::ostream &stream, ElectricityBill &printStream) { 

    stream << "E;" 
    << printStream.billerName << ";" 
    << printStream.billerCode << ";" 
    << printStream.referenceNumber << ";" 
    << printStream.accountNumber << ";" 
    << printStream.accountName << ";" 
    << printStream.address << ";" 
    << printStream.periodStartDate.day << "/" << printStream.periodStartDate.month << "/" << printStream.periodStartDate.year << ";" 
    << printStream.periodDueDate.day << "/" << printStream.periodDueDate.month << "/" << printStream.periodDueDate.year << ";" 
    << printStream.amountDue << ";" 
    << printStream.totalGST; 

    return stream; 
} 

Aus irgendeinem Grund wird der Ausgabespeicher ausgibt Adressen anstelle der erwartete Daten. Warum passiert das und was kann ich tun, um es zu beheben?

+0

Der zweite Parameter zu 'Operator <<' sollte eine const Referenz, nicht nur eine Referenz sein. All dies wird bereits von 'std :: vector' übernommen. – PaulMcKenzie

+0

Ich hätte 'std :: vector' benutzt, aber das ist für eine Uni-Zuweisung und wir dürfen sie leider nicht verwenden. Es ist nichts als erste Prinzipale hier:/ – SteppingHat

+0

Ich denke es ist Zeit, Universitäten zu haben 1) Haben Sie 'std :: vector' oder 2) Haben Sie eine legitime dynamische Array-Klasse geschrieben, anstatt Zeiger überall in einem zu werfen Hauptfunktion. Zumindest bei letzterem lernen Sie etwas über das richtige Verwalten von Zeigern. – PaulMcKenzie

Antwort

2

Ihr überladener Bediener akzeptiert einen Verweis auf eine ElectricityBill, aber Sie scheinen einen Zeiger bereitzustellen. Daher wird die Standardimplementierung für << verwendet, die den Speicherort druckt. Versuchen Sie:

std::cout << *temp[0] << std::endl; 
std::cout << *EB[0] << std::endl; 
+0

Ich habe in den letzten paar Stunden so viel mit diesen Zeigern zu tun gehabt, ich bin verrückt geworden und habe begonnen, die Grundlagen zu vergessen und mein Wissen in Frage zu stellen. Danke, dass du mir geholfen hast, gesund zu bleiben! – SteppingHat

Verwandte Themen