C++ 重载指针 ostream

标签 c++ arrays class pointers overloading

我正在学习 C++,并且有一个类(class)项目将在 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;
    }
}

最佳答案

v.data是一个指针,所以它打印一个指针。你想让它怎么样 打印指针指向的任何内容。除了性格 指针,<<总是打印你给它的东西(以某种格式 方式)。如果你不希望它打印一个指针,给的是别的东西。

假设它确实解除了对指针的引用。它应该打印什么:一个 vehReg ? 20?指针没有关于大小的信息。如果 你用过std::vector<vehReg> (一个更好的选择),它会知道 大小,但 std::vector 上仍然没有过载, 因为 系统仍然不知道您希望它如何格式化(逗号分隔? 每个都在一个新行上?)。而且您还没有告诉它如何打印 vehReg 要么。

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

关于C++ 重载指针 ostream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12413110/

相关文章:

c++ fopen 正在返回一个文件 * 带有 <bad ptr> 的

c++ - 在 C++ 中使用另一个变量来限制数组索引

javascript - 空数组在比较时返回 false 但当它单独返回 true 时......为什么这样

javascript - JavaScript 类中使用箭头函数的继承和多态性

c++ - 接口(interface)的名称是否可以与其类中的名称不同? [C++]

c# - 拦截和取消 DirectX 游戏的按键事件

c++ - 如何在 QMenu 中为 QActions 指定助记符(&符号快捷方式)?

c - 关于用 C 中的用户输入填充数组的问题

php - 添加到数组连续数字

Java 从 getUsername() 获取 NULL 值; (不同的类文件)