2016-04-17 2 views
1

Я пытаюсь создать динамический массив указателей на количество экземпляров класса, ElectricityBill.Динамический массив указателей классов

Мой текущий подход заключается в создании динамического массива ElectricityBills (в настоящее время ни с чем), а затем создать единый экземпляр ElectricityBill, создать еще один набор ElectricityBills, размер которого на этот раз больше, скопируйте все экземпляры старого динамического массива через, добавьте новый в конец.

код того, что я пробовал ниже

// 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; 

и выход

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

Стоит отметить, что я перегрузил операторы << и >> в определении класса. Оператор >> предлагает пользователю ввести данные и хранит входные данные в приватной секции класса переменных, а оператор << построен следующим образом:

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; 
} 

По какой-то причине, выход выводит адреса памяти вместо ожидаемые данные. Почему это происходит и что я могу сделать, чтобы исправить это?

+0

Второй параметр 'operator <<' должен быть ссылкой на константу, а не только ссылкой. Кроме того, все это позаботится уже о 'std :: vector'. – PaulMcKenzie

+0

Я бы использовал 'std :: vector', но это для присвоения uni, и мы не можем использовать его, к сожалению. Здесь нет ничего, кроме первых принципов:/ – SteppingHat

+0

Я думаю, что пришло время, чтобы университеты либо 1) использовали ли вы 'std :: vector', либо 2). Вы пишете законный класс динамических массивов вместо того, чтобы бросать указатели по всему месту в 'main'. По крайней мере, с последним вы узнаете, как правильно управлять указателями. – PaulMcKenzie

ответ

2

Ваш перегруженный оператор принимает ссылку на ElectricityBill, но вы, кажется, предоставляете указатель. Следовательно, используется реализация по умолчанию для <<, которая печатает местоположение памяти. Попытайтесь:

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

Я столько раз общался с этими указателями за последние несколько часов, я сошел с ума и начал забывать основы и сомневаться в своих знаниях. Спасибо, что помог мне сохранить разумность! – SteppingHat

Смежные вопросы