2012-09-13 5 views
1

나는 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; 
    } 
} 
+0

[sscce] (http://sscce.org)의 주요 후보입니다. 주소를 인쇄하는 이유에 대한 답은 포인터 자체에 대한 기본 지식에 있습니다. – chris

+0

"포인터가 아닌 포인터의 주소가 계속 인쇄됩니다."아마도 여기에서 "그"가 무엇을 의미하는지에 대한 단서를 줄 수 있습니까? 나는 (지나치게 긴) 코드를 탐색했지만 가능한 용의자는 찾지 못했습니다. @chris가 암시 하듯이 컴파일, 실행 및 문제를 보여주는 가장 간단한 예제로 잘라냅니다. 그래도 문제가 무엇인지 알려주지 않는다면 코드의 예상 버전에 대한 설명과 실제로 수행 한 내용이 적힌 코드 버전을 게시하십시오. –

+0

@PeteBecker, 오버로드 된'operator <<'print'v.data'는 포인터입니다. 나는 당신이 가지고있는 문제를 복제하는 sscce의 좋은 예라고 [이] (http://liveworkspace.org/code/cce76ba541a348c700fd057e9e676595)라고 말하고 싶습니다. 물론 문제는 포인터 자체에 대한 첫 번째 의견을 암시하기 때문에 문제가 발생하기위한 구조조차 필요하지 않습니다. – chris

답변

2

v.data은 포인터이므로 포인터를 인쇄합니다. 에 포인터가 가리키는 부분을 어떻게 인쇄할까요? 문자 포인터를 제외하고 <<은 항상 사용자가 지정한 것을 인쇄합니다 ( 형식으로 포맷 됨). 포인터를 인쇄하고 싶지 않다면, 다른 것을 제공하십시오.

포인터를 역 참조했다고 가정합니다. 인쇄 내용 : vehReg? 20? 포인터에는 크기에 관한 정보가 없습니다. 당신이 std::vector<vehReg> (훨씬 더 나은 선택)을 사용했던 경우가 에게 크기를 알 것입니다,하지만 시스템이 여전히 당신이 포맷 방법을 알려하지 않기 때문에 std::vector에 과부하가 아직 없다 (쉼표에? 각각 분리 새로운 라인?). 그리고 vehReg 중 하나를 인쇄하는 방법에 대해서도 언급하지 않았습니다.

당신은 분명히 <<에 오버로드하는 방법에 대한 아이디어를 이해합니다. 처음으로 해야 할 일은 vehReg에 대한 오버로드도 제공하는 것입니다. 두 가지 오버로드는 기존 오버로드의 측면에서 정의해야합니다. std::vector에 대한 포인터가 없으며 포인터에 대한 포인터가 이 아니므로 <<을 루프해야합니다 vehData의 경우 각 요소를 출력하고 어떤 구분 기호를 사용할지 결정하려면 을 선택하십시오. 자체 줄에 각 요소가있는 경우 루프에 std::copyostream_iterator을 사용할 수 있습니다. 그러나 지금까지 배운 내용 중 일 수 있습니다.) 그리고 앞으로 <<vehReg으로 전달할 수 있습니다. 각 vehReg.

+0

우리는 아직 벡터를 배웠습니다 : ( –

+0

@TimHibbard, 그들은 당신을 위해 관리를하고 다른 컨테이너와 공용 인터페이스를 공유하는 동적 배열입니다. – chris

+0

나는 이것을 쉽게 할 수 있다고 생각합니다. –

0

v.data은 포인터이므로 메모리 주소입니다.

*v.data은 포인터가 가리키는 포인터입니다 (이 경우 정수).예를 들어

, 같은 출력한다

#include <iostream> 

using namespace std; 

void main() { 
int *ptr; 
int var = 5; 
ptr = &var; 
cout << ptr << endl; 
cout << *ptr << endl; 
system("pause"); 
} 

첫째 줄 : 0043F930

번째 줄은 인쇄 것이다 5

이 데이터 배열에 유지 된 요소를 출력한다.

void vehData::showStructure() const { 
    for (int i = 0; i < capacity: i++) { 
     cout << data[i]; 
    } 
    cout << endl; 
}