Eラーニングプラットフォーム
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 103/104。
チャレンジ
簡単このコースで習得したすべてのOOPコンセプトを統合した、Eラーニングプラットフォームを構築しましょう。コースの管理、さまざまな種類のレッスンの作成、受講生の進捗管理を行うシステムを作成します。これにより、継承階層、ポリモーフィズム、スマートポインタ、およびデザインパターンが調和して機能することを実証します。
コードは以下の6つのファイルに分けて構成します:
User.h: 基底クラスUserと、そこから派生する2つのクラスStudentおよびInstructorによるユーザー階層を作成します。基底クラス
Userは名前(name)とIDを持ち、ユーザータイプを文字列として返す仮想メソッドgetRole()と、"[name] ([id]) - [role]"を返すgetInfo()メソッドを持つ必要があります。Studentクラスは、登録されたコースID(文字列の vector を使用)と完了したレッスン数を追跡します。enrollInCourse(const std::string& courseId)、カウントをインクリメントするcompletedLesson()、およびgetCompletedCount()メソッドを追加してください。Instructorクラスは、専門分野(specialty)の文字列を保持し、担当するコースIDを追跡します。addCourse(const std::string& courseId)とgetSpecialty()を追加してください。Lesson.h: 抽象基底クラスを使用してレッスン階層を構築します。Lesson基底クラスは、タイトル(title)と所要時間(duration、分単位)を持ち、完了メッセージを返す純粋仮想メソッドcomplete()と、レッスンの種類を返すgetType()メソッドを持つ必要があります。以下の3つの派生クラスを作成してください:
VideoLesson: ビデオURLを持ちます。complete()は"Watched video: [title]"を返します。QuizLesson: 質問数を持ちます。complete()は"Completed quiz: [title] ([questions] questions)"を返します。TextLesson: 単語数を持ちます。complete()は"Read article: [title]"を返します。
それぞれ
getType()をオーバーライドして、"Video"、"Quiz"、または"Text"を返すようにします。Course.h: スマートポインタを使用してレッスンを所有するCourseクラスを作成します。コースはタイトル、ID、および講師IDを持ちます。コースがレッスンを独占的に所有するため、レッスンは
std::vector<std::unique_ptr<Lesson>>として保存します。以下のメソッドを追加してください:
addLesson(std::unique_ptr<Lesson> lesson)— レッスンの所有権をコースに譲渡します。getLessonCount()— レッスンの数を返します。getLesson(size_t index)— 指定されたインデックスのレッスンへのポインタを返します(無効な場合は nullptr)。displayCurriculum()— 各レッスンのタイプとタイトルを"[index]. [Type]: [title]"の形式で出力します。
LessonFactory.h: Factory パターンを実装して、異なる種類のレッスンを作成します。std::unique_ptr<Lesson>を返す静的メソッドcreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra)を持つLessonFactoryクラスを作成します。typeパラメータによって、作成するレッスン("video"、"quiz"、または"text")を決定します。extraパラメータには、ビデオの場合はURL、クイズの場合は質問数(intとしてパース)、テキストの場合は単語数(intとしてパース)といった、タイプ固有のデータが含まれます。Platform.h: すべてを調整する中心となるPlatformクラスを構築します。コースを
std::vector<std::shared_ptr<Course>>として、ユーザーをstd::vector<std::shared_ptr<User>>として保存します。以下を実装してください:
addCourse(std::shared_ptr<Course> course)addUser(std::shared_ptr<User> user)findCourse(const std::string& id)— shared_ptr または nullptr を返します。findUser(const std::string& id)— shared_ptr または nullptr を返します。enrollStudent(const std::string& studentId, const std::string& courseId)— 両方を見つけ、受講生を登録し、"Enrolled [name] in [course title]"または"Enrollment failed"を出力します。completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex)— 受講生とコースを見つけ、レッスンの complete() メソッドを呼び出し、受講生の完了数をインクリメントし、完了メッセージまたは"Could not complete lesson"を出力します。
main.cpp: すべてを統合してプラットフォームを実演します。以下の4つの入力を読み取ります:
- プラットフォーム名
- コースの詳細(形式:
title,courseId,instructorId) - 受講生の詳細(形式:
name,studentId) - 追加するレッスン(形式:
type,title,duration,extra)
プラットフォームを作成し、
"Welcome to [platform name]!"を表示します。コースと受講生を作成し、プラットフォームに追加します。LessonFactory を使用してレッスンを作成し、コースに追加します。コースのカリキュラムを表示します。受講生をコースに登録します。その受講生の最初のレッスン(インデックス 0)を完了させます。最後に、受講生の情報と完了したレッスン数を"Completed lessons: [count]"として出力します。
例えば、入力が CodeAcademy、C++ Mastery,CPP101,I001、Alice,S001、および video,Introduction to OOP,30,https://example.com/oop の場合:
Welcome to CodeAcademy!
1. Video: Introduction to OOP
Enrolled Alice in C++ Mastery
Watched video: Introduction to OOP
Alice (S001) - Student
Completed lessons: 1入力が LearnHub、Python Basics,PY100,I002、Bob,S002、および quiz,Variables Quiz,15,10 の場合:
Welcome to LearnHub!
1. Quiz: Variables Quiz
Enrolled Bob in Python Basics
Completed quiz: Variables Quiz (10 questions)
Bob (S002) - Student
Completed lessons: 1このチャレンジは、実際のEラーニングプラットフォームがどのように構造化されているかを示しています。ユーザー、コンテンツ、およびそれらを調整するプラットフォームが明確に分離されています。Factory パターンはレッスンの作成を柔軟にし、スマートポインタは安全なメモリ管理を保証し、ポリモーフィズムはすべてのレッスンタイプを統一的に扱いながら、それぞれが独自に動作することを可能にします。
自分で試してみよう
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "User.h"
#include "Lesson.h"
#include "Course.h"
#include "LessonFactory.h"
#include "Platform.h"
int main() {
// 入力を読み込む
std::string platformName;
std::getline(std::cin, platformName);
std::string courseDetails; // 形式: title,courseId,instructorId
std::getline(std::cin, courseDetails);
std::string studentDetails; // 形式: name,studentId
std::getline(std::cin, studentDetails);
std::string lessonDetails; // 形式: type,title,duration,extra
std::getline(std::cin, lessonDetails);
// TODO: courseDetails を解析して title, courseId, instructorId を抽出する
// TODO: studentDetails を解析して name, studentId を抽出する
// TODO: lessonDetails を解析して type, title, duration, extra を抽出する
// TODO: プラットフォームを作成し、"Welcome to [platform name]!" を表示する
// TODO: コースと受講生を作成し、プラットフォームに追加する
// TODO: LessonFactory を使用してレッスンを作成し、コースに追加する
// TODO: コースのカリキュラムを表示する
// TODO: 受講生をコースに登録する
// TODO: 受講生の最初のレッスン(インデックス 0)を完了させる
// TODO: 受講生の情報と完了したレッスン数を表示する
// 形式: "Completed lessons: [count]"
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス