2017-05-10 4 views
-1

Je remarqué je ne peux pas comparer directement les deux SDL_point s:Comparez deux SDL_point?

SDL_Point a = {1, 2}; 
SDL_Point b = {1, 2}; 

if (a == b) std::cout << "a = b\n"; // Doesn't compile. 
if (a.x == b.x && a.y == b.y) // I have to do this instead. 
    std::cout << "a = b\n"; 

Je voudrais surcharger le operator==, mais depuis SDL_Point fait partie de SDL, je ne sais pas comment, parce que je veux utiliser l'opérateur surchargé dans beaucoup de différentes classes de mon jeu.

Quelle est la manière normale de faire ceci?

+1

Les surcharges d'opérateur de comparaison peuvent être [fonctions libres] (http://en.cppreference.com/w/cpp/language/operator_comparison), pas seulement les fonctions membres. – genpfault

Répondre

2

Juste un utilitaire ou en-tête sdl_utility qui définit la ligne de l'opérateur:

inline bool operator==(SDL_Point const &a, SDL_Point const &b) 
{ 
    return a.x == b.x && a.y == b.y; 
} 

inline bool operator!=(SDL_Point const &a, SDL_Point const &b) 
{ 
    return !(a == b); 
} 

Vous devrez inclure cette tête dans un fichier source qui veut utiliser l'opérateur.

+0

Bien, je pensais à quelque chose comme ça, mais je ne savais pas si c'était une bonne pratique. Merci! :) – JoePerkins

+1

@JoePerkins Je dirais que c'est bien aussi longtemps que vous construisez un binaire, et non une bibliothèque. Si vous créez une bibliothèque, vous ne voulez probablement pas ajouter d'opérateurs supplémentaires dans vos en-têtes car ils deviennent alors une partie de l'interface de votre bibliothèque, et si quelqu'un veut utiliser votre bibliothèque avec une autre bibliothèque qui définit son propre opérateur. == 'pour' SDL_Point', ils vont avoir un mauvais moment. Vous pouvez atténuer cela en gardant l'opérateur dans l'espace de noms de votre bibliothèque. – cdhowie

+0

@JoePerkins (À moins que l'objectif spécifique de votre bibliothèque soit de fournir une couche C++ pour SDL, c'est-à-dire.) – cdhowie