0
struct Database
{
    String _name;
    int _age;
    String _sex;
    String _email;
    String _eid;
    String _address;
    double _percentage;
};

class MyStudentDatabase
{
    public: MyStudentDatabase();~MyStudentDatabase();
    void addData(String name, int age, String sex, String email, String eid, String address, double percentage);

    private: int _iSize;
    Database * _pStructObject;
};

这是定义部分-

MyStudentDatabase::MyStudentDatabase()
: _iSize(1)
{
    _pStructObject = new Database[_iSize];
}

MyStudentDatabase::~MyStudentDatabase()
{}

void MyStudentDatabase::addData(String name, int age, String sex, String email, String eid, String address, double percentage)
{
    _pStructObject[_iSize - 1]._name = name;
    _pStructObject[_iSize - 1]._sex = sex;
    _pStructObject[_iSize - 1]._email = email;
    _pStructObject[_iSize - 1]._eid = eid;
    _pStructObject[_iSize - 1]._address = address;
    _pStructObject[_iSize - 1]._percentage = percentage;
}

这个程序只保存一次数据,因为结构的大小是_iSize(1),所以_pStructObject[0]对所有成员都有效,现在我想添加另一个成员并将该addData(...)函数的大小增加_iSize++;但问题是,如果我这样做,当我在构造函数中使用“new”运算符时,以前的数据会丢失。有什么解决办法吗?

4

3 回答 3

2

您似乎正在尝试编写自己的容器。除非这是家庭作业,否则您应该使用其中一种标准容器。std::vector 或 std::list。

在顶部:

#include <vector>

代替:

int _iSize;
Database * _pStructObject;

利用:

std::vector<Database> students;

在您的实施中:

void MyStudentDatabase::addData(String name, int age, String sex, String email, String eid, String address, double percentage)
{
  Database new_student;
  // fill out the new student here
  students.push_back(new_student);
}
于 2013-03-22T07:27:19.873 回答
1

为什么不使用标准库中的容器之一?

例如,您可以使用std::vector<Database>std::list<Database>。如果您使用向量,您还可以动态分配结构以避免在需要调整它的大小时(即)不必要的结构复制,或者如果可以的话提前std::vector<Database*>设置它。capacity

STL 文档可在 cppreference.com 或 cplusplus.com 上找到。

于 2013-03-22T07:27:55.103 回答
0

您有两种选择,一种是使用memmove(在后台,固定大小的 STL continers 使用它),在内部这意味着您保留一个新的内存空间,将信息从旧的内存空间复制到新的内存空间,并释放旧的一个,或者,您可以使用一个链表,每次需要时添加一个新节点(由 STL 的所有列表“风格”使用)。

于 2013-03-22T14:27:11.907 回答