1

私は学習中の C++ で、5 日以内に予定されているクラス プロジェクトがあります。これを行う方法を調査するのに4時間費やしましたが、まだ答えが出ていません。スタックを保存してください!

問題。動的配列を保持するクラスへのポインターがあります。その配列をファイルに保存して、後で取得する必要があります。これが私の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;
    }
}
4

2 に答える 2

2

v.dataはポインターなので、ポインターを出力します。ポインターが指すものをどのように印刷しますか。文字ポインターを除いて、 は<<常に指定したものを (何らかの方法でフォーマットして) 出力します。ポインターを出力したくない場合は、give は別のものです。

ポインターを逆参照したとします。何を出力する必要がありますか: one vehReg? 20? ポインターには、サイズに関する情報はありません。を使用した場合std::vector<vehReg>(はるかに良い選択)、サイズはわかりstd::vectorますが、システムはまだどのようにフォーマットするか (コンマ区切り? 新しい行ごと?) を認識していないため、 にオーバーロードはありません。そして、どちらかを印刷する方法を教えていませんvehReg

どうやら をオーバーロードする方法のアイデアを理解しているよう<<です。最初にやらなければならないことは、vehReg同様にオーバーロードを提供することです。そして、両方のオーバーロードは、既存のオーバーロードの観点から定義する必要があります: std::vectorfor はなく、ポインタ用のものはあなたが望むことをしない (そしてできなかった) ため、<<for をループしてvehData各要素を出力する必要があります。 、あなたが決めたどんなセパレーターでも。(各要素がそれぞれの行にある場合は、ループに forstd::copyostream_iteratorfor を使用できますが、これまでに学習したことよりも少し前のことかもしれません。) <<for vehRegeachに進みますvehReg

于 2012-09-13T19:18:51.357 に答える
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

2行目が印刷されます:5

これにより、データ配列に保持されている要素が出力されます。

void vehData::showStructure() const {
    for (int i = 0; i < capacity: i++) {
         cout << data[i];
    }
    cout << endl;
}
于 2012-09-13T20:13:30.283 に答える