複数のレコードをファイルに保存するプログラムを作成しています。さまざまなレコードを表すさまざまなクラスと、ファイルを管理するテンプレート クラスである別のクラスがあります。
template <class DataType> class Table
{
public:
Table(const char* path);
bool add(const DataType& reg);
template <class FilterType> void print(const FilterType& filter) const
{
DataType reg;
...
if (reg == filter)
{
cout << reg << endl;
}
...
}
private:
const char* path;
};
class Student
{
public:
char cods[5];
char noms[20];
};
class Course
{
public:
char codc[5];
char nomc[20];
};
class Rating
{
public:
char cods[5];
char codc[5];
int prom;
}
1 人の学生の評価と、コース内のすべての学生の評価を印刷する必要があります。このようなもの:
Table<Rating> trat("path.dat");
trat.print("A001") //print the ratings for student A001.
trat.print("C001") //print the students for course C001.
すべての助けをいただければ幸いです。
- - - 編集 - - - -
わかりました、答えてくれてありがとう。これらのクラスをファイルに書き込むため、クラスの各メンバーの固定サイズが必要なため、cstrings を使用します。
私が達成したいのは、任意のタイプまたはレコードで機能するテンプレート クラス テーブルを作成することです。
私が考えていたのは、演算子のオーバーロードを比較と出力に使用できるということでした。
このようなもの:
class Student
{
public:
char cods[5];
char noms[25];
class CodsType
{
public:
CodsType(const string& cods) : cods(cods) {}
operator string() const { return cods; }
string cods;
};
};
class Course
{
public:
char codc[5];
char nomc[20];
class CodcType
{
public:
CodcType(const string& codc) : codc(codc) {}
operator string() const { return codc; }
string codc;
};
};
class Rating
{
public:
char cods[5];
char codc[5];
int prom;
bool operator==(const Course::CodcType& codc) const
{
return (this->codc == string(codc));
}
bool operator==(const Student::CodsType& cods) const
{
return (this->cods == string(cods));
}
};
その後:
Table<Rating> trat("path.dat");
trat.print(Student::CodsType("A001")) //print the ratings for student A001.
trat.print(Course::CodcType("C001")) //print the students for course C001.
しかし、問題は、フィルターごとにクラスを作成する必要があることです。これを行うより良い方法はありますか?