나는 C++ 학습을하고 있으며 5 일 내에 수업 프로젝트를 준비 중입니다. 나는 이것을하는 방법을 연구하는 데 4 시간을 보냈지 만, 아직 답을 찾지 못했습니다. 나를 구해줘!C++ 오버로드 포인터 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'는 포인터입니다. 나는 당신이 가지고있는 문제를 복제하는 sscce의 좋은 예라고 [이] (http://liveworkspace.org/code/cce76ba541a348c700fd057e9e676595)라고 말하고 싶습니다. 물론 문제는 포인터 자체에 대한 첫 번째 의견을 암시하기 때문에 문제가 발생하기위한 구조조차 필요하지 않습니다. – chris