Я изучаю C++ и предлагаю проект класса через 5 дней. Я провел 4 часа, исследуя, как это сделать, но я еще не получил ответа. Сохраните стек!C++ overload pointer ostream
Проблема. У меня есть указатель на класс, который содержит динамический массив. Мне нужно взять этот массив и сохранить его в файл для последующего извлечения. Вот мои 2 заголовка и реализация. Я не пишу код для сохранения в файл, но это будет легко, когда я обойду эту проблему. Моя проблема заключается в том, что он печатает адрес указателя, а не данные внутри.
vehReg.h
class vehReg {
public:
/* STUFF */
};
}
#endif
vehData.h
#include "vehReg.h"
using namespace std;
class vehData {
public:
//CONSTRUCTORS
vehData();
//DECONSTRUCTOR
~vehData();
//METHODS
friend ostream &operator<<(ostream &output, const vehData &v);
private:
typedef unsigned long longType;
typedef std::size_t sizeType;
sizeType used,capacity;
vehReg *data;
};
}
#endif
vehData.cpp
//CONSTRUCTOR
vehData::vehData(){
capacity = 5;
used = 0;
data = new vehReg[capacity];
}
//DECONSTRUCTOR
vehData::~vehData(){
delete []data;
}
/* TRYING TO ACCOMPLISH THIS WITH AN OSTREAM OVERLOAD */
void vehData::saveDataSloppy(){
ofstream myFile;
myFile.open ("database.db");
for(int i=0;i<used;i++){
myFile << data[i].getOwnerName() << "|";
myFile << data[i].getVehicleLicense() << "|";
myFile << data[i].getVehicleMake() << "|";
myFile << data[i].getVehicleModel() << "|";
myFile << data[i].getVehicleYear() << "\n";
}
myFile.close();
}
void vehData::saveData(){
cout << data;
}
ostream &operator<<(ostream &stream, const vehData &v){
stream << v.data;
}
}
Это главный кандидат на [sscce] (http://sscce.org). Ответ на то, почему он печатает адрес, лежит в основе самих указателей, и я уверен, что вы узнали, что у вас есть задание, сосредоточенное вокруг них. – chris
«он печатает адрес указателя, а не данные внутри», возможно, вы могли бы дать нам представление о том, что здесь означает «это»? Я просмотрел (слишком длинный) код и не подозревал. Как предлагает @chris, сократите его до самого простого примера, который вы можете создать, который компилирует, запускает и иллюстрирует проблему. Если это не показывает вам, что происходит не так, разместите сокращенную версию кода с описанием того, что вы ожидаете от этого, и тем, что он на самом деле делает. –
@PeteBecker, это перегруженный 'operator <<' print' v.data', который является указателем. Я бы сказал, [это] (http://liveworkspace.org/code/cce76ba541a348c700fd057e9e676595) является хорошим примером sscce, который реплицирует проблему, которую вы имеете. Конечно, как намекнул мой первый комментарий о том, что проблема заключается в самих указателях, вам даже не понадобится структура для возникновения проблемы. – chris