我正在制作一个程序,可以在文件中保存多个记录。我有不同的类代表不同的记录和另一个类,一个管理文件的模板类。
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;
}
我必须打印一名学生和课程中所有学生的评分。像这样:
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.
但问题是我必须为每个过滤器做一个类。还有更好的方法吗?
答案 0 :(得分:2)
首先,“你想做什么”?
模板很强大而其他模板很强大,但它们不会自行解决。你仍然需要了解你想做什么。
第一:你是用C ++编程的。不要使用char数组。使用std :: string。在大多数情况下,这就是你想要的,一些“文字”。
#include <string>
class Student
{
public:
std::string cods;
std::string noms;
};
第二:reg == filter
是什么意思? reg和filter有不同的类型!他们不能平等!如果你想比较它们,你需要定义“平等”的含义。
模板无法帮助您。它们不是魔杖。你需要自己思考。如果您只将模板用于一种类型,则不需要模板。
#include <string>
class Table
{
Table(const std::string & path);
bool add(const Student & a); // add student to table
bool add(const Course & a); // add course to table
bool add(const Rating & a); // add rating to table
void filter(const std::string & str) const; // filter by string and print
};
void Table::filter(const std::string & str)
{
// find students, courses, and ratings here
}
您仍然需要弄清楚如何处理这3种结构。那仍然取决于你