Plateforme d’apprentissage en ligne
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy. Leçon 103 sur 104.
Défi
FacileConstruisons une plateforme d’apprentissage en ligne qui rassemble tous les concepts de la POO que vous avez maîtrisés tout au long de ce cours. Vous allez créer un système qui gère les cours, différents types de leçons et suit la progression des étudiants, en démontrant des hiérarchies d’héritage, le polymorphisme, les pointeurs intelligents et des patrons de conception fonctionnant en harmonie.
Vous organiserez votre code sur six fichiers :
User.h: créez une hiérarchie d’utilisateurs avec une classe de baseUseret deux classes dérivées :StudentetInstructor.Votre classe de base
Userdoit avoir un nom et un identifiant, avec une méthode virtuellegetRole()qui renvoie le type d’utilisateur sous forme de chaîne, ainsi qu’une méthodegetInfo()qui renvoie"[name] ([id]) - [role]".La classe
Studentsuit les identifiants des cours auxquels l’étudiant est inscrit (utilisez un vecteur de chaînes) ainsi que le nombre de leçons terminées. Ajoutez les méthodesenrollInCourse(const std::string& courseId),completedLesson()pour incrémenter le compteur, etgetCompletedCount().La classe
Instructorstocke une chaîne représentant sa spécialité et suit les identifiants des cours qu’il enseigne. AjoutezaddCourse(const std::string& courseId)etgetSpecialty().Lesson.h: construisez une hiérarchie de leçons à l’aide d’une classe de base abstraite.Votre classe de base
Lessondoit avoir un titre et une durée (en minutes), avec une méthode virtuelle purecomplete()qui renvoie un message de fin, ainsi qu’une méthodegetType()qui renvoie le type de leçon.Créez trois classes dérivées :
VideoLesson: possède une URL vidéo. Sa méthodecomplete()renvoie"Watched video: [title]"QuizLesson: possède un nombre de questions. Sa méthodecomplete()renvoie"Completed quiz: [title] ([questions] questions)"TextLesson: possède un nombre de mots. Sa méthodecomplete()renvoie"Read article: [title]"
Chacune doit redéfinir
getType()pour renvoyer respectivement"Video","Quiz"ou"Text".Course.h: créez une classeCoursequi possède ses leçons à l’aide de pointeurs intelligents.Un cours possède un titre, un identifiant et l’identifiant de l’instructeur. Stockez les leçons sous forme de
std::vector<std::unique_ptr<Lesson>>, puisque le cours est l’unique propriétaire de ses leçons.Ajoutez les méthodes suivantes :
addLesson(std::unique_ptr<Lesson> lesson): transfère la propriété de la leçon au coursgetLessonCount(): renvoie le nombre de leçonsgetLesson(size_t index): renvoie un pointeur vers la leçon à cet index (ou nullptr si l’index est invalide)displayCurriculum(): affiche le type et le titre de chaque leçon au format"[index]. [Type]: [title]"
LessonFactory.h: implémentez le patron Factory pour créer différents types de leçons.Créez une classe
LessonFactoryavec une méthode statiquecreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra)qui renvoie unstd::unique_ptr<Lesson>.Le paramètre
typedétermine la leçon à créer ("video","quiz"ou"text"). Le paramètreextracontient les données spécifiques au type : l’URL pour une vidéo, le nombre de questions pour un quiz (à analyser comme un entier) ou le nombre de mots pour un texte (à analyser comme un entier).Platform.h: construisez la classe centralePlatformqui coordonne tous les éléments.Stockez les cours sous forme de
std::vector<std::shared_ptr<Course>>et les utilisateurs sous forme destd::vector<std::shared_ptr<User>>.Implémentez :
addCourse(std::shared_ptr<Course> course)addUser(std::shared_ptr<User> user)findCourse(const std::string& id): renvoie un shared_ptr ou nullptrfindUser(const std::string& id): renvoie un shared_ptr ou nullptrenrollStudent(const std::string& studentId, const std::string& courseId): trouve les deux éléments, inscrit l’étudiant, puis affiche"Enrolled [name] in [course title]"ou"Enrollment failed"completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex): trouve l’étudiant et le cours, appelle la méthode complete() de la leçon, incrémente le nombre de leçons terminées par l’étudiant, puis affiche le message de fin ou"Could not complete lesson"
main.cpp: rassemblez tous les éléments pour présenter votre plateforme.Lisez quatre entrées :
- Nom de la plateforme
- Détails du cours (format :
title,courseId,instructorId) - Détails de l’étudiant (format :
name,studentId) - Leçon à ajouter (format :
type,title,duration,extra)
Créez la plateforme et affichez
"Welcome to [platform name]!". Créez le cours et l’étudiant, puis ajoutez-les à la plateforme. Utilisez LessonFactory pour créer la leçon et l’ajouter au cours. Affichez le programme du cours. Inscrivez l’étudiant au cours. Terminez la première leçon (index 0) pour cet étudiant. Enfin, affichez les informations de l’étudiant ainsi que son nombre de leçons terminées sous la forme"Completed lessons: [count]".
Par exemple, avec les entrées CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 et 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: 1Avec les entrées LearnHub, Python Basics,PY100,I002, Bob,S002 et 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: 1Ce défi montre comment les véritables plateformes d’apprentissage en ligne sont structurées, avec une séparation claire entre les utilisateurs, le contenu et la plateforme qui les coordonne. Le patron Factory rend la création des leçons flexible, les pointeurs intelligents assurent une gestion sûre de la mémoire et le polymorphisme permet de traiter tous les types de leçons de manière uniforme, tout en leur permettant de se comporter chacun de façon unique.
Essayez vous-même
#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() {
// Lire les entrées
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: Analyser courseDetails pour extraire title, courseId, instructorId
// TODO: Analyser studentDetails pour extraire name, studentId
// TODO: Analyser lessonDetails pour extraire type, title, duration, extra
// TODO: Créer la plateforme et afficher "Welcome to [platform name]!"
// TODO: Créer le cours et l'étudiant, les ajouter à la plateforme
// TODO: Utiliser LessonFactory pour créer la leçon et l'ajouter au cours
// TODO: Afficher le programme du cours
// TODO: Inscrire l'étudiant au cours
// TODO: Compléter la première leçon (index 0) pour l'étudiant
// TODO: Print the student's info and completed lesson count
// Format: "Completed lessons: [count]"
return 0;
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d’accès en C++Spécificateurs d’accès en profondeurMasquage de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l’opérateur d’affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif – Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur génériqueEntraînez-vous par vous-même : Compilateur C++ en ligne