2011-10-04 2 views

Répondre

2

Vous voulez normalement pas surcharger l'opérateur global :

Point operator+(Point const &a, float b); 
Point operator+(float a, Point const &b); 

Au lieu de deux surcharges , vous pouvez utiliser une seule surcharge:

Point operator+(Point const &a, Point const &b); 

et ont un cteur pour créer un point d'un float:

class Point { 
    public: 
     Point(float); 
}; 

Dans ce cas, l'ajout d'un flotteur à un point utilisera le cteur pour convertir le flotteur à un point, puis utilisez votre opérateur surchargé + pour ajouter ces deux Points ensemble.

+1

En effet. Mais beaucoup (par exemple Meyers) soutiendraient que les constructeurs de conversion implicites peuvent conduire à des problèmes ... –

+0

@OliCharlesworth: ils peuvent certainement * conduire * à certains problèmes, mais quand vous regardez attentivement, ils surviennent le plus souvent lorsque vous convertissez de la classe à la base type. Du type de base à la classe * tend * à être beaucoup plus sûr (bien que cela puisse * certainement * poser des problèmes). –

+0

Notamment dans ce cas: 'point + 10 'combine déjà les notions mathématiques de vecteur et de valeurs scalaires, en permettant à l'utilisateur d'écrire' 10' à la place de 'point_offset (10,10,10)' (notez qu'un point et une valeur vectorielle sont également légèrement différentes - les vecteurs peuvent être utilisés pour désigner des points relatifs à une origine, mais tous les vecteurs * ne sont pas * et il est mathématiquement dénué de sens d'ajouter deux points ensemble). Si vous combinez ces concepts, il me semble logique d'autoriser cette conversion implicite. Si vous ne les combinez pas, n'autorisez pas non plus 'Point + float'. –

2

En fonction libre:

Point operator+(float other, const Point &pt) { 
    return pt+other; 
} 
1

En dehors de la classe:

inline Point operator+(const float& other, const Point& pnt) { return Point(...); }; 
2

Compte tenu d'une Point& Point::operator+=(float other) existante, ajoutez ces deux fonctions libres:

Point operator+(Point pt, float other) { 
    return pt += other; 
} 
Point operator+(float other, Point pt) { 
    return pt += other; 
}