E-Learning-Plattform
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 103 von 104.
Aufgabe
EinfachLassen Sie uns eine E-Learning-Plattform bauen, die alle OOP-Konzepte zusammenführt, die Sie in diesem Kurs gemeistert haben. Sie werden ein System erstellen, das Kurse und verschiedene Arten von Lektionen verwaltet sowie den Fortschritt der Studenten verfolgt — und dabei zeigen, wie Vererbungshierarchien, Polymorphismus, Smart Pointer und Entwurfsmuster harmonisch zusammenarbeiten.
Sie werden Ihren Code auf sechs Dateien verteilen:
User.h: Erstellen Sie eine Benutzerhierarchie mit einer BasisklasseUserund zwei abgeleiteten Klassen:StudentundInstructor.Ihre Basisklasse
Usersollte einen Namen und eine ID haben, mit einer virtuellen MethodegetRole(), die den Benutzertyp als String zurückgibt, und einer MethodegetInfo(), die"[name] ([id]) - [role]"zurückgibt.Die Klasse
Studentverfolgt die IDs der eingeschriebenen Kurse (verwenden Sie einen Vector von Strings) und die Anzahl der abgeschlossenen Lektionen. Fügen Sie die MethodenenrollInCourse(const std::string& courseId),completedLesson()zum Erhöhen des Zählers undgetCompletedCount()hinzu.Die Klasse
Instructorspeichert einen Spezialisierungs-String und verfolgt die IDs der Kurse, die sie unterrichten. Fügen SieaddCourse(const std::string& courseId)undgetSpecialty()hinzu.Lesson.h: Erstellen Sie eine Lektionshierarchie unter Verwendung einer abstrakten Basisklasse.Ihre Basisklasse
Lessonsollte einen Titel und eine Dauer (in Minuten) haben, mit einer rein virtuellen Methodecomplete(), die eine Abschlussmeldung zurückgibt, und einer MethodegetType(), die den Lektionstyp zurückgibt.Erstellen Sie drei abgeleitete Klassen:
VideoLesson: Hat eine Video-URL. Ihrcomplete()gibt"Watched video: [title]"zurück.QuizLesson: Hat eine Anzahl von Fragen. Ihrcomplete()gibt"Completed quiz: [title] ([questions] questions)"zurück.TextLesson: Hat eine Wortanzahl. Ihrcomplete()gibt"Read article: [title]"zurück.
Jede Klasse sollte
getType()überschreiben, um jeweils"Video","Quiz"oder"Text"zurückzugeben.Course.h: Erstellen Sie eine KlasseCourse, die ihre Lektionen mittels Smart Pointern besitzt.Ein Kurs hat einen Titel, eine ID und eine Dozenten-ID. Speichern Sie Lektionen als
std::vector<std::unique_ptr<Lesson>>, da der Kurs seine Lektionen exklusiv besitzt.Fügen Sie folgende Methoden hinzu:
addLesson(std::unique_ptr<Lesson> lesson)— überträgt den Besitz der Lektion auf den Kurs.getLessonCount()— gibt die Anzahl der Lektionen zurück.getLesson(size_t index)— gibt einen Pointer auf die Lektion an diesem Index zurück (oder nullptr, falls ungültig).displayCurriculum()— gibt den Typ und Titel jeder Lektion im Format"[index]. [Type]: [title]"aus.
LessonFactory.h: Implementieren Sie das Factory-Muster, um verschiedene Lektionstypen zu erstellen.Erstellen Sie eine Klasse
LessonFactorymit einer statischen MethodecreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra), die einenstd::unique_ptr<Lesson>zurückgibt.Der Parameter
typebestimmt, welche Lektion erstellt werden soll ("video","quiz"oder"text"). Der Parameterextraenthält typspezifische Daten: URL für Video, Fragenanzahl für Quiz (als int parsen) oder Wortanzahl für Text (als int parsen).Platform.h: Bauen Sie die zentrale KlassePlatform, die alles koordiniert.Speichern Sie Kurse als
std::vector<std::shared_ptr<Course>>und Benutzer alsstd::vector<std::shared_ptr<User>>.Implementieren Sie:
addCourse(std::shared_ptr<Course> course)addUser(std::shared_ptr<User> user)findCourse(const std::string& id)— gibt shared_ptr oder nullptr zurück.findUser(const std::string& id)— gibt shared_ptr oder nullptr zurück.enrollStudent(const std::string& studentId, const std::string& courseId)— findet beides, schreibt den Studenten ein, gibt"Enrolled [name] in [course title]"oder"Enrollment failed"aus.completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex)— findet den Studenten und den Kurs, ruft die complete()-Methode der Lektion auf, erhöht den Zähler der abgeschlossenen Lektionen des Studenten und gibt die Abschlussmeldung oder"Could not complete lesson"aus.
main.cpp: Bringen Sie alles zusammen, um Ihre Plattform zu demonstrieren.Lesen Sie vier Eingaben ein:
- Name der Plattform
- Kursdetails (Format:
title,courseId,instructorId) - Studentendetails (Format:
name,studentId) - Hinzuzufügende Lektion (Format:
type,title,duration,extra)
Erstellen Sie die Plattform und geben Sie
"Welcome to [platform name]!"aus. Erstellen Sie den Kurs und den Studenten, fügen Sie sie der Plattform hinzu. Verwenden Sie die LessonFactory, um die Lektion zu erstellen und dem Kurs hinzuzufügen. Zeigen Sie das Kurs-Curriculum an. Schreiben Sie den Studenten in den Kurs ein. Schließen Sie die erste Lektion (Index 0) für diesen Studenten ab. Geben Sie schließlich die Informationen des Studenten und die Anzahl seiner abgeschlossenen Lektionen als"Completed lessons: [count]"aus.
Zum Beispiel mit den Eingaben CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 und 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: 1Mit den Eingaben LearnHub, Python Basics,PY100,I002, Bob,S002 und 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: 1Diese Herausforderung zeigt, wie echte E-Learning-Plattformen strukturiert sind — mit einer klaren Trennung zwischen Benutzern, Inhalten und der Plattform, die sie koordiniert. Das Factory-Muster macht die Erstellung von Lektionen flexibel, Smart Pointer gewährleisten eine sichere Speicherverwaltung und Polymorphismus ermöglicht es Ihnen, alle Lektionstypen einheitlich zu behandeln, während sich jeder individuell verhält.
Probier es selbst
#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() {
// Eingaben lesen
std::string platformName;
std::getline(std::cin, platformName);
std::string courseDetails; // Format: title,courseId,instructorId
std::getline(std::cin, courseDetails);
std::string studentDetails; // Format: name,studentId
std::getline(std::cin, studentDetails);
std::string lessonDetails; // Format: type,title,duration,extra
std::getline(std::cin, lessonDetails);
// TODO: courseDetails parsen, um title, courseId, instructorId zu extrahieren
// TODO: studentDetails parsen, um name, studentId zu extrahieren
// TODO: lessonDetails parsen, um type, title, duration, extra zu extrahieren
// TODO: Die Plattform erstellen und "Welcome to [platform name]!" anzeigen
// TODO: Den Kurs und den Studenten erstellen und zur Plattform hinzufügen
// TODO: LessonFactory verwenden, um die Lektion zu erstellen und zum Kurs hinzuzufügen
// TODO: Das Kurs-Curriculum anzeigen
// TODO: Den Studenten in den Kurs einschreiben
// TODO: Die erste Lektion (Index 0) für den Studenten abschließen
// TODO: Die Informationen des Studenten und die Anzahl der abgeschlossenen Lektionen ausgeben
// Format: "Completed lessons: [count]"
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container