Question

J'ai un code qui a un système de classe dynamique en C ++ qui a appelé un membre GetClassName (), un nom plutôt inoffensif qu'on ne l'imagine. Cependant lorsqu'il est inclus dans un grand projet avec les en-têtes de Windows enfer se déchaîna. Apparemment, Windows utilise un GetClassName #define (GetClassNameA ou GetClassNameW) qui se visse à tout, et mon arbre d'appel virtuel est devenu tout foiré me faire perdre un jour stupide débogage du compilateur dans l'obscurité, en essayant de comprendre ce qui était erroné.

Ainsi, en plus du point que je maudire Microsoft pour l'utilisation d'un tel horriblement facile de nom pour un affrontement define (je veux dire quelqu'un doit honnêtement être fusillé pour cela!) Je demande 3 buts.

  1. Quel est un autre bon nom pour GetClassName ()?
  2. Y at-il de toute façon à résoudre ce problème, à l'avenir, d'autres les développeurs de ma base de code ne sera pas souffrent le même sort
  3. Et pour la postérité quand quelqu'un d'autre De même rencontre cette erreur inexplicable
Était-ce utile?

La solution

Je renommer la méthode.

Bien sûr, on peut dire

#include <windows.h>
#undef GetClassName

mais il est pas propre, les utilisateurs d'un code de ne doivent pas oublier d'écrire :: GetClassNameW quand ils appellent la fonction win32.

On peut fournir des méthodes et GetClassNameA GetClassNameW dans sa classe, mais il est simplement laid.

Je vois deux approches: soit rallonger ou raccourcir le nom:)

1) ajouter un préfixe pour toutes les fonctions du sous-système, f.e TI_ (pour plus d'informations de type):

TI_GetClassName() 
TI_GetBaseClass() 
TI_IsDerivedFromClass()
etc  

2) ou les mettre dans une interface IClass

interface IClass {
GetName();
GetBase(); 
IsDerivedFrom();
etc

et retourner cette interface de méthode unique,
de sorte que GetClassName () devient

GetClass()->GetName()

Autres conseils

  1. ClassGetName()
  2. #undef GetClassName
  3. WinAPI est une API C. Pas namespaces. D'autres plates-formes tentent d'atténuer ce par préfixer tous les noms de symbole, mais finalement qui se désagrège aussi bien. Meilleur pari: si vous écrivez du code qui ne dépend pas des en-têtes SDK Plate-forme Windows, puis ne les #include pas .

GetWindowClassName peut-être? En réalité, GetClassName est pas un mauvais nom pour cette API en ce qui concerne les classes de fenêtre. Le vrai problème est que c'est une déclaration de l'API C et déclarations C ont aucun moyen d'introduire une déclaration réutilisable qui ne pollue pas l'espace de noms global.

Ceci est beaucoup plus un défaut de langage C que Microsoft.

L'API Windows est plein de macros chock avec des noms propres qui se dilatent pour fonctionner avec des noms un suffixe indiquant ASCII / UTF-16, en fonction des options de construction. Il aurait été bien s'ils préfixés tout avec « W32 » ou similaire (à la « NS » sur OS X), mais ils ont choisi de ne pas garder sans doute pour l'API « propre ».

Comme il est beaucoup plus facile de changer votre code que leur API, voici quelques suggestions:

1) Apprendre l'API Windows (il est en fait pas si grand!), Ou tout au moins se familiariser avec MSDN de sorte que vous pouvez rechercher des conflits de noms lorsque vous rencontrez le déroulement du programme inexplicable.

2) Utilisez la résolution de portée explicite dans votre code où vous pouvez (MyClass :: GetClassName ()). Malheureusement, cela cassera l'envoi de fonction virtuelle, donc soyez prudent.

3) Utilisez une convention de nommage différent dans votre code. MS utilise toujours CamelCase, donc vous ne serez pas en conflit si vous choisissez une autre convention (get_class_name (), getClassName (), etc.).

4) Personnellement, je déteste nommer mes getters et setters "GetX ()" et "SetX ()", mais préfère se pencher sur le mécanisme de surcharge et l'utilisation "xtype X () const" pour getters et « vide X ( xtype newval) » pour setters. Votre kilométrage peut varier, mais je trouve plus propre et le get / set est évident à partir des arguments. Il est évident que vous devez être prudent si vous utilisez des arguments par défaut.

Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top