【发布时间】:2020-05-22 16:37:13
【问题描述】:
这是我的 C++ 类和代码片段。数据没有正确加载到对象中,这给了我内存访问错误。我能做些什么? 基类
using namespace std;
class Person;
class Person
{protected:
int ID;
string name;
string address;
long int phone;
string dob;
//char pass[25];
std::string pass;
public:
Person();
Person(int ID,string name, string address, long int phone, string dob, string pass) :
ID(ID),name(name), phone(phone),address(address),dob(dob),pass(pass)
{};
//COPY CONSTRUCTOR MUST BE CREATED INORDER TO MAKE VECTOR WORK
Person(const Person&);
virtual void showDetails() const = 0;
//MAKING THIS CLASS AN ABSTRACT CLASS
//BUNCH OF GETTERS
int getID() const;
string getName() const;
string getAddress() const;
long int getPhone() const;
string getDob() const;
string getPass() const;
void setPass(string a);
};
这是它的派生类:
#include<iostream>
#include"Person.h"
#ifndef CUSTOMER_H
#define CUSTOMER_H
class Customer :public Person {
private:
float balance;
protected:
public:
Customer() :Person(), balance(0) {}
Customer(int ID,std::string name,std::string address,long int phone, string dob,std::string
pass,float balance):
Person(ID,name,address,phone,dob,pass),balance(balance){};
//Customer(int ID, const char* name, const char* address, long int phone, string dob, const
char* pass, float balance) :
// Person(ID, name, address, phone, dob, pass), balance(balance) {};
//COPY CONSTRUCTOR MUST BE PROVIDED, ELSE VECTOR WONT WORK
Customer(const Customer& other) :Person(other) {
this->balance = other.balance;
}
float getBalance() const;
void showDetails() const;
// void setValues();
void deposit(float);
void withdraw(float);
};
#endif
我遇到了数据没有从文件正确复制到向量的问题:这是文件处理的实现:
void Controller::displayCustomers()
{
vector<Customer> custVector;
Customer cust;
fstream fin("customer.txt", ios::binary | ios::in);
while (fin.read(reinterpret_cast<char*>(&cust), sizeof(cust)));
{
custVector.push_back(cust);
}
fin.close();
cout << "ID\tNAME\tADDRESS\tPHONE\t\tDOB\tPASSWORD\tBALANCE" << endl;
for (vector<Customer>::iterator itr = custVector.begin();
itr != custVector.end(); ++itr)
{
cout << itr->getID() << "\t" << itr->getName() << "\t" << itr->getAddress() << "\t"
<< itr->getPhone() << "\t" << itr->getDob() << "\t" << itr->getPass() <<
"\t" << itr->getBalance() << endl;
}
cout << endl;
}
构造函数运行的不仅仅是数据成员,并且在访问向量成员时会出现内存访问错误。最佳做法应该是什么?
【问题讨论】:
-
while (fin.read(reinterpret_cast<char*>(&cust), sizeof(cust)));不能使用像std::string或std::vector这样的非 POD 类来完成。此外,.txt不是二进制数据扩展的好选择,因为数据不是文本,不应作为文本文件读取。此外,如果您使用相同的技术写入数据也是错误的。您最终将指针存储在数据文件中,而不是指针指向的实际字符串。
标签: c++ serialization file-handling