0

複数のレコードをファイルに保存するプログラムを作成しています。さまざまなレコードを表すさまざまなクラスと、ファイルを管理するテンプレート クラスである別のクラスがあります。

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.

しかし、問題は、フィルターごとにクラスを作成する必要があることです。これを行うより良い方法はありますか?

4

1 に答える 1

2

まず「何をしようとしているのか?」

テンプレートは強力ですが、単独では機能しません。何をしようとしているのかを理解する必要があります。

最初に: C++ でプログラミングしています。文字配列は使用しないでください。std::string を使用します。ほとんどの場合、「テキスト」が必要です。

#include <string>    

class Student
{
public:
    std::string cods;
    std::string noms;
};

2番目: とはどういう意味ですかreg == filter??? reg と filter には異なるタイプがあります。それらは等しくあり得ません!それらを比較したい場合は、「等しい」の意味を定義する必要があります。

テンプレートは役に立ちません。それらは魔法の杖ではありません。自分で考える必要があります。また、テンプレートを 1 つのタイプだけに使用する場合は、テンプレートは必要ありません。

#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 つの構造をどのように処理するかを理解する必要があります。それはまだあなた次第です

于 2012-08-11T00:29:31.033 に答える