我正在学习 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/