0

注: これは宿題です。

私は現在、大規模なプロジェクトに取り組んでいます.3つのクラス(私たちが焦点を当てます)、基本クラスのStudent、および2つの派生クラスGradとUndergradがあり、学生クラスを明示的に使用することはありません.しかし、学生にタイプキャストされた卒業生と学部生の両方を含むリンクリストを作成するつもりはありません.私の質問は、派生クラスでカスケードを実装する方法についてです.

私の基本クラスには小さな関数があり、Undergrad で完全に上書きされた実装があります

基本クラス:

virtual UnderGrad& setMajor(std::string) {} 

大学生:

//purpose: sets the major       
UnderGrad& UnderGrad::setMajor(std::string maj)
{
    major = maj;
    return *this;
}

これが正しいのか、それとも関数の正しい実装なのか疑問に思っているので、次のようなカスケードを使用できます

curStudent.setStudentNum().setMajor()......

私がしていることは正しいですか?もしそうなら、私の基本クラスは何を返すべきですか? すなわち

return *(new Undergrad(....));

編集 いくつかの質問に答えるには、Grad と UnderGrad の 2 つのクラスを保持するリンク リストが必要です。これらのリストを並べ替えるには、とりわけ、派生クラス (一意の変数) にアクセスする必要がありますが、私は持っています。それらは Student にキャストされます (割り当てで必要なため)。そのため、クラス固有のデータにアクセスするには、それにアクセスするために記述された仮想メソッドが必要です (はい、私の意見では、それは役に立たないようで、1 つのクラスの Student でできることはすべて実行できます)。これらの 3 では、1 つのクラスを持つことはできません) したがって、そうでなければ「手の届かない」変数にアクセスするために、特に派生クラスで使用する仮想メソッドを作成するのは間違っています。次に、Undergrad のコンストラクターはメジャーを設定しますが、データを編集したい場合は、古いデータをすべて取得して古いノードを削除し、古いデータと新しいメジャーで新しいノードを作成するのは冗長に思えます

以下のコメントでのクリスの回答は、まさに私が必要としていたものだと思います

4

1 に答える 1

1

私には、あなたの基本クラスはAbstract Class. つまり、type のクラスをインスタンス化することはありませんStudent。これは単なる抽象化であり、コード共有のメカニズムです。

C++ にはabstract、 のような他の OO 言語にあるようなキーワード for はありませんC#, Java。ただし、関数を としてマークすることで、抽象的なメカニズムを実現できますpure virtual。これを行うには、次のように仮想関数を 0 に設定するだけです。

virtual UnderGrad& setMajor(std::string) = 0;

これで、派生クラスがこの関数をオーバーライドしない場合、コンパイラ エラーが発生します。これは、「学生を派生させる人は誰でも、実装しなければならない」という契約を提供しますsetMajor。そのため、Studentクラスはこの関数を実装せず、関数がabstractorであるため何も返しませんpure virtual

はどうかと言うと

curStudent.setStudentNum().setMajor()......

setStudentNumタイプ学生のオブジェクトを返す方法がわかりません。これらを 2 つの別々の呼び出しに分割したい場合があります。例えば

curStudent.setStudentNum(2058937);
curStudent.setMajor("Computer Science");
于 2013-04-01T21:54:49.437 に答える