cpp/README.md

5.9 KiB

CPP Modules - École 42

Description

Les modules CPP constituent une série de 9 exercices progressifs de l'École 42 pour apprendre le C++ moderne. Chaque module (CPP00 à CPP08) introduit des concepts fondamentaux du langage avec une complexité croissante.

Objectifs pédagogiques

  • Maîtriser la programmation orientée objet en C++
  • Comprendre les spécificités du C++ par rapport au C
  • Apprendre les bonnes pratiques de développement
  • Maîtriser la gestion mémoire moderne (RAII)
  • Découvrir les design patterns essentiels

Modules détaillés

CPP00 - Bases du C++

Concepts abordés :

  • Namespaces, classes, fonctions membres
  • stdio streams, listes d'initialisation
  • static, const, et autres qualificateurs
  • Exercices : Megaphone, PhoneBook

CPP01 - Allocation mémoire, pointeurs, références

Concepts abordés :

  • new/delete vs malloc/free
  • Références en C++
  • Pointeurs vers fonctions membres
  • Exercices : Zombie horde, HarlFilter

CPP02 - Forme canonique orthodoxe

Concepts abordés :

  • Constructeur de copie
  • Opérateur d'assignation
  • Destructeur
  • Exercices : Fixed point numbers, BSP

CPP03 - Héritage

Concepts abordés :

  • Héritage public/privé/protégé
  • Classes abstraites
  • Polymorphisme de base
  • Exercices : ClapTrap, FragTrap, DiamondTrap

CPP04 - Polymorphisme

Concepts abordés :

  • Fonctions virtuelles
  • Classes abstraites avancées
  • Interfaces en C++
  • Exercices : Animal, Brain, Materia

CPP05 - Exceptions

Concepts abordés :

  • Try/catch/throw
  • Classes d'exception personnalisées
  • RAII et exception safety
  • Exercices : Bureaucrat, Form, Intern

CPP06 - Casts C++

Concepts abordés :

  • static_cast, dynamic_cast
  • const_cast, reinterpret_cast
  • Détection de types
  • Exercices : Conversion, Serialize, Base

CPP07 - Templates

Concepts abordés :

  • Templates de fonctions
  • Templates de classes
  • Spécialisation
  • Exercices : swap, iter, Array

CPP08 - Conteneurs templés

Concepts abordés :

  • STL containers (vector, list, stack)
  • Itérateurs
  • Algorithmes STL
  • Exercices : easyfind, Span, MutantStack

Technologies utilisées

  • C++98 (standard imposé par 42)
  • Compilation : g++ avec flags stricts
  • Makefile pour chaque exercice
  • Orthodox Canonical Form obligatoire

Structure globale

cpp/
├── cpp00/              # Module 00 - Bases
│   ├── ex00/          # Megaphone
│   ├── ex01/          # PhoneBook
│   └── ex02/          # Bonus
├── cpp01/              # Module 01 - Mémoire
│   ├── ex00/          # BraiiiiiiinnnzzzZ
│   ├── ex01/          # Moar brainz!
│   ├── ex02/          # HI THIS IS BRAIN
│   ├── ex03/          # Unnecessary violence
│   ├── ex04/          # Sed is for losers
│   ├── ex05/          # Harl 2.0
│   └── ex06/          # Harl filter
├── cpp02/              # Module 02 - Forme canonique
├── cpp03/              # Module 03 - Héritage
├── cpp04/              # Module 04 - Polymorphisme
├── cpp05/              # Module 05 - Exceptions
├── cpp06/              # Module 06 - Casts
├── cpp07/              # Module 07 - Templates
└── cpp08/              # Module 08 - Conteneurs

Compilation et utilisation

Compilation d'un exercice

cd cpp00/ex00
make
./megaphone

Flags de compilation obligatoires

CXXFLAGS = -Wall -Wextra -Werror -std=c++98

Tests

# Chaque exercice inclut des tests
make test

Concepts clés développés

Programmation Orientée Objet

  • Encapsulation : private/public/protected
  • Héritage : public, private, multiple
  • Polymorphisme : virtual, override, abstract

Gestion mémoire C++

  • RAII (Resource Acquisition Is Initialization)
  • Smart pointers concepts de base
  • Exception safety garantees

Templates et généricité

  • Paramètres de templates (type, non-type)
  • Spécialisation partielle et totale
  • SFINAE concepts de base

STL et conteneurs

  • Itérateurs et leur utilisation
  • Algorithmes standards
  • Conteneurs (vector, list, map, etc.)

Exercices remarquables

PhoneBook (CPP00)

Contact manager avec interface utilisateur

class PhoneBook {
private:
    Contact contacts[8];
    int     index;
public:
    void addContact();
    void searchContact();
    void displayContacts();
};

Fixed Point (CPP02)

Implémentation d'un type de nombre à virgule fixe

class Fixed {
private:
    int                 fixedValue;
    static const int    fractionalBits = 8;
public:
    Fixed(const Fixed& other);
    Fixed& operator=(const Fixed& other);
    bool operator>(const Fixed& other) const;
    Fixed operator+(const Fixed& other) const;
};

Bureaucrat (CPP05)

Gestion d'exceptions et hiérarchie de classes

class Bureaucrat {
private:
    const std::string   name;
    int                 grade;
public:
    class GradeTooHighException : public std::exception {};
    class GradeTooLowException : public std::exception {};
    void incrementGrade();
    void decrementGrade();
};

Normes et contraintes 42

Contraintes de codage

  • Orthodox Canonical Form obligatoire
  • Pas de STL avant CPP08
  • Compilation sans warning
  • Pas de memory leaks

Bonnes pratiques appliquées

  • RAII pour la gestion de ressources
  • const correctness
  • Exception safety
  • Single Responsibility Principle

Compétences développées

  • Maîtrise complète du C++ moderne
  • Design patterns orientés objet
  • Gestion mémoire avancée
  • Programmation générique
  • Architecture logicielle robuste

Évaluation

Chaque module est évalué individuellement :

  • Tests automatisés
  • Code review par les pairs
  • Défense orale du code

Auteur

Alexandre Pommier (apommier) - École 42

Note globale obtenue

Tous les modules validés

Licence

Projet académique - École 42