Bonjour à tous, je souhaiterais me perfectionner en c++ et j'aimerais savoir quel(s) livre(s) me seraient les plus adaptés. Voici brièvement quelques informations :

-Je ne fais de la programmation qu'en tant qu'amateur.

J'ai fait que deux languages :

-1 année de C.
J'ai fini par créer un jeu en 2D et, voyant la difficulté que j'ai eu à créer la GUI, malgré l'apprentissage de GTK, j'ai décidé de me lancer dans un projet de GUI.
Une grosse galère en C, et je me suis lancé au c++.
-Presque une année de C++ maintenant, et je pense avoir acquis les bases :
-Notion d'objet.
-Héritage.
-Polymorphisme.
-Surcharges.
-templates.
-...
J'ai récemment finis un projet en c++. Si cela peut vous aider à évaluer mes lacunes. Le voici.
Je pense ne jamais pouvoir revenir au C...
Je trouve que le véritable avantage du C++ par rapport au C, est les templates et les surcharges. Le coté POO ne me parait pas forcément nécessaire.

J'ai tous appris globalement avec les cours et tutoriels C+ et la FAQ C++ développez.com et recherches google. Je n'ai jamais lu de livre C++.

Cependant, j'ai l'impression d'être passé à coté de notions essentielles. C'est pourquoi, je pense qu'un/des livre(s) s'imposent.

Voici les aspects que je souhaiterais améliorer :

La POO :

-Faut-il toujours utiliser la notion d'objet ? Dans quels cas oui, dans quels cas non ? Est-il normal qu'il que je me retrouve souvent avec des fonctions externe à tout objet ? Est-ce une habitude du C ?
-Quand faut-il définir des fonctions membres (méthodes) et quand faut-il définir des fonctions en dehors de tout objet ? Exemple :
struct Ligne
{
float a,b,c;//Equation du type ax+by=c.
};

Faut-il définir la fonction Point*(le pointeur est là pour renvoyer null en cas de colinéarité) GetIntersection(const Ligne& un, const Ligne& deux);
Ou plutôt :
Point*Ligne::GetIntersection(const Ligne& autre) const;
-Quand le polymorphisme se justifie t-il ? Exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
struct Node
{
Node*first;
Node*second;
Operateur op;
float GetValue()const;
};
J'ai pensé à cette structure quand j'ai voulu faire quelque chose comme :
(a+(b*c))
Mais bien sur, une telle structure ne marche pas :
Ou stocke t-on la valeur de a,b et c ?
Que se passe t-il si a,b,c sont des variables ?
Faut-il faire un :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
struct Number : public Node
{
float val;
};
 
et un 
struct variable : public Node
{
std::string v_name;
std::function<float(std::string)> GetValueFromVariable;
};
Et déclarer GetValue virtuelle ? Ou, y a t-il une solution plus propre ?


Bien sur, ceci ne sont que des exemples, mais ils illustrent certains problèmes que je me pose en POO.


Généricité

J'ai l'impression avoir acquis une certaine expérience en templates et généricité en générale. Cependant, si il y a une livre qui traite de :
-Allocateur de la STL.
-Création de son propre container avec itérateurs et allocateurs.

Algorithmie

-Dans beaucoup de problèmes, je rencontrent des graphes. Je n'ai AUCUNE connaissance mathématique ou théorique des graphes. S'il existe un livre qui traite des structures à utiliser pour stocker l'information, pour exécuter des algorithmes classiques (Djiskra par exemple), ... tout cela en c++ avec un vocabulaire de débutant, ce serait parfait.

Je me rend bien compte que avoir UN livre traitant de tous ces problèmes est irréaliste, cependant, si vous pouviez me proposer une liste de livre, ce serait parfait. Je vais ajouter que je créé avant tout des bibliothèques et non une application finie. Peut-être un livre sur les design patterns s'impose-t-il mais j'ai trouver les tutoriels sur développez très compréhensible et il me semble qu'ils suffisent. Y a t-il déjà un bon livre sur c++1x (google répond plutôt rarement à mes questions quand j'ai un problème spécifique avec c++1x) ?

Merci à tous ceux qui ont lus ce long message, les questions que je pose dans la partie POO ne sont que des exemples de problèmes que j'ai en POO.