cpp/README.md

230 lines
5.9 KiB
Markdown

# 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
```bash
cd cpp00/ex00
make
./megaphone
```
### Flags de compilation obligatoires
```makefile
CXXFLAGS = -Wall -Wextra -Werror -std=c++98
```
### Tests
```bash
# 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
```cpp
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
```cpp
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
```cpp
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