Menu
Coddy logo textTech

Eラーニングプラットフォーム

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 103/104。

challenge icon

チャレンジ

簡単

このコースで習得したすべての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つの入力を読み取ります:

    1. プラットフォーム名
    2. コースの詳細(形式:title,courseId,instructorId
    3. 受講生の詳細(形式:name,studentId
    4. 追加するレッスン(形式:type,title,duration,extra

    プラットフォームを作成し、"Welcome to [platform name]!" を表示します。コースと受講生を作成し、プラットフォームに追加します。LessonFactory を使用してレッスンを作成し、コースに追加します。コースのカリキュラムを表示します。受講生をコースに登録します。その受講生の最初のレッスン(インデックス 0)を完了させます。最後に、受講生の情報と完了したレッスン数を "Completed lessons: [count]" として出力します。

例えば、入力が CodeAcademyC++ Mastery,CPP101,I001Alice,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

入力が LearnHubPython Basics,PY100,I002Bob,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;
}

オブジェクト指向プログラミングのすべてのレッスン