Vous permettez que, pour une fois et malgré le titre du topic, que je tape un peu sur C++ aussi ?
Outre les critiques habituelles et puériles du genre « y'a pas de GC c'est nul », en C++, je trouve que séparer la définition de l'implémentation (.hpp/.cpp) est une fondalementalement très bonne chose. Cependant, quelque chose dans cette séparation m'irrite aussi un peu.
JE sais bien qu'il y a des raisons pratiques et historiques derrière ça, mais je trouve extrêmement dommage que les membres privés aient l'obligation de se trouver dans le .hpp aussi. Pour moi ils ne devraient rien avoir à y faire. L'utilisateur du .hpp n'a pas à savoir ce que j'utilise en privé dans mon implémentation.
J'ai déjà essayé de contourner cette limitation avec un truc ultra crado de ce genre; divisant par 2 voire 3 le temps de compilation en bonus simplement parce que l'énorme fichier unordered_map avec ses gigantesques dépendances n'est inclut que là où il est vraiment nécessaire ; ce qui me fait dire que c'est une bonne solution mais avec un mauvais code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // MyClass.hpp class MyClass { private: char storage[123]; public: // constructeur, méthodes, destructeur; osef ici }; // MyClass.cpp #include<unordered_map> using namespace std; MyClass::MyClass () { new(storage) unordered_map<string,string>(); // Ultra dégueu } unordered_map<string,string>& MyClass::myMember () { return (unordered_map<string,string>&)(storage); // Un peu dégueu } MyClass::~MyClass { myMember().~unordered_map<string,string>(); // Ultra dégueu } |
J'ai sûrement dû louper quelque chose dans mon apprentissage du C++ pour réussir à pondre des atrocités pareilles. Mon langage de prédilection reste quand même toujours le java.
Dans la continuité de ceci, il y a bien sûr l'impossibilité de séparer la définition et l'implémentation des fonctions/classes génériques comme on le fait normalement pour le reste; là aussi c'est très dommage.
Quelqu'un pour m'expliquer où j'ai tort ?