c ++重载指针ostream

时间:2012-09-13 19:06:26

标签: c++ arrays class pointers overloading

我是一名学习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;
    }
}

2 个答案:

答案 0 :(得分:2)

v.data是一个指针,因此它会打印一个指针。你想怎么做? 打印指针指向的任何内容。除了角色 指针,<<总是打印你给它的东西(格式化为一些 办法)。如果您不希望它打印指针,则给出其他内容。

假设它确实取消了指针的引用。它应该打印什么:一个 vehReg? 20?指针没有关于大小的信息。如果 你知道,你曾经使用std::vector<vehReg>(一个更好的选择) 大小,但std::vector仍然没有超载,因为。{ 系统仍然不知道你想如何格式化(逗号分隔? 每个都在新的一行?)。你还没有告诉它如何打印vehReg

您显然理解如何重载<<。首先 你需要做的就是为vehReg提供过载。 并且必须根据现有的重载来定义两个重载: std::vector没有一个,指针的那个没有 你想要什么(而且不能),所以你必须循环你的<< vehData并使用您决定的任何分隔符输出每个元素 上。 (如果它是每个元素在它自己的行上,那么你可以使用std::copy 循环的ostream_iterator,但这可能有点提前 到目前为止你学到了什么。)然后转到<< vehReg 每个vehReg

答案 1 :(得分: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;
}