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++; しかし、問題は、そうすると、コンストラクター内で「新しい」演算子を使用すると、以前のデータが失われることです。これに対する解決策はありますか?

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

標準ライブラリのコンテナの 1 つを使用してみませんか?

たとえばstd::vector<Database>、またはを使用できます。std::list<Database>ベクトルを使用する場合は、構造体を動的に割り当てて、サイズを変更する必要があるときに不要な構造体のコピーを回避することもできます (つまり、可能であれば事前にstd::vector<Database*>設定することもできます) 。capacity

STL ドキュメントは、cppreference.com または cplusplus.com で入手できます。

于 2013-03-22T07:27:55.103 に答える
0

2 つの選択肢があります。1 つはmemmoveを使用することです(バックグラウンドでは、固定サイズの STL コンティナーが使用します)。内部的には、新しいメモリ空間を予約し、古いメモリ空間から新しいメモリ空間に情報をコピーし、古いメモリ空間を解放することを意味します。 1つ、または必要なたびに新しいノードを追加するリンクリストを使用できます(STLのすべてのリスト「フレーバー」で使用されます)。

于 2013-03-22T14:27:11.907 に答える