2010-05-19 7 views
2

gars heloremplacer la surcharge de l'opérateur en C++?

j'ai appel de classe complexe

je l'ai fait la surcharge d'opérateur comme tel

Complex c = a + b; // where a and b are object of Complex class 

qui est essentiellement opérateur + (Complexe & que);

mais je ne sais pas comment dire par exemple

double c = a + 10; //where a is object of Complex class but 10 is integer/double 

Je ne définissaient transtypage pour être le double obtenir mon IDE dit qu'il ya trop de opérandes + et il se plaint d'une certaine manière pour ne pas être en mesure de " comprendre » le +

il doit être dans ce format si double c = a + 10;

grâce

message d'erreur est

Error: more than one operator "+" matches these operands: 
error C2666: 'Rational::operator +' : 3 overloads have similar conversions 

1> could be 'const Complex Complex::operator +(const Complex &)' 1> 
or 'double operator +(const Complex &,double)' 

le compilateur ne peut pas choisir en fonction de la signature? et oui je ne définissaient en dehors de la classe parce que j'avais celui défini dans la classe grâce

+0

Je pense que cela devrait probablement être étiqueté 'C++'. – Maulrus

+0

Ceci est clairement défini dans * Plus efficace C++ * de Scott Meyer, article 22: Envisager d'utiliser * op = * au lieu de autonome * op *. Le livre * C++ * plus efficace est presque obligatoire pour tout développement C++ sérieux. –

Répondre

4
double operator+(const Complex &c, int x) 
{ 
    //.... 
} 
+0

Appartient-il à une classe complexe ou doit-il être défini en dehors de la classe? parce que j'ai essayé ceci et cela dit trop d'opérandes pour l'opérateur + :( –

+0

@stdnoit: Comme je l'ai donné un exemple, il appartient à l'extérieur de la classe Si vous le voulez à l'intérieur de la classe, vous omettez le premier argument –

+0

Je reçois toujours Erreur: plus d'un opérateur "+" correspond à ces opérandes:
erreur C2666: 'Rational :: opérateur +': 3 surcharges ont des conversions similaires 1> pourrait être 'const Complex Complex :: operator + (const Complex &) '1> ou
' double opérateur + (const Complex &, double) 'le compilateur ne peut pas choisir en fonction de la signature? Et oui je l'ai défini en dehors de la classe car j'en ai défini un dans la classe merci –

1

surcharge operator+ pour un double opérande:

double Complex::operator+(double rhs) 
+0

Je reçois toujours Erreur: plus d'un opérateur "+" correspond à ces opérandes: erreur C 2666: 'Rational :: operator +': 3 surcharges ont des conversions similaires 1> pourrait être 'const Complex Complex :: opérateur + (const Complex &)' 1> ou 'double opérateur + (const Complex &, double)' le compilateur ne peut pas choisir basé sur la signature? et oui je l'ai défini en dehors de la classe parce que j'en avais un défini à l'intérieur de la classe merci –

+0

Euh, je ne sais pas. Ils ont différents types de retour et différentes listes d'arguments, donc je ne sais pas pourquoi. Êtes-vous sûr de ne pas avoir une fonction membre et une fonction non-membre définie avec un argument complexe & et double? – Maulrus

3

Que diriez-vous de mettre dans un constructeur de la forme:

Complex(float _real) : m_Real(_real), m_Imaginary(0){} 

de sorte que toute valeur qui peut être converti en un float peut être ingérée en tant que Complex. Ensuite, vous n'avez pas besoin de faire un opérateur surchargé pour toutes sortes de types. Celui que vous avez écrit pour Complex suffira.

0

Si vous envisagez de le faire, vous pouvez procéder comme suit. Tout d'abord, nous définissons les éléments suivants (en dehors de la classe afin que la conversion implicite pour le premier et le second opérande est autorisé), ne définit aucun autre opérateur +, comme opérateur + (Complexe, double):

Complex operator+(const Complex& a, const Complex& b) { 
    // .. 
} 

Au en même temps de définir un constructeur implicite:

Complex(double a) : real(a), imag(0) {} 

Et puis définissez l'opérateur de conversion (comme Wheaties ont souligné, cela peut être considéré comme une mauvaise pratique de programmation, que je suis d'accord, donc si la conversion finale du double n'est pas nécessaire, omettre ceci):

operator double() const { return real; } 

Cela soutiendra automatiquement double c = a_complex + 10; et double c = 10 + a_complex;, le nombre 10 sera implicitement converti en un Complex utilisant le constructeur implicite et l'arithmétique résoudra à operator+(const Complex&, const Complex&);, le résultat sera converti en doubler automatiquement.

P.S. Vous pouvez également définir Complex& operator+=(const Complex& o) { /* .. */ } dans la classe et l'utiliser pour implémenter operator+ ci-dessus.

+0

Cette conversion 'operator double() const {return real; } 'est considéré comme une mauvaise pratique. En fait, c'est la première entrée dans la section des opérateurs de More My C++ de Scott Myer. – wheaties

+0

C'est. Cependant, il répond au besoin de conversion automatique en double (je n'encourage pas personnellement une telle conversion automatique, mais l'OP l'a demandé). Si l'OP ne nécessite pas que le résultat soit assigné à un double mais à un complexe, omettre l'opérateur double() const. :) –

+0

je ne sais pas vraiment pourquoi cela est une erreur et pourquoi le compilateur ne pas choisir la méthode d'appeler basée sur la fonction erreur C2666: « opérateur :: Complexe + »: 3 ont des conversions similaires surcharges i have opérateur + surchargée et défini à l'intérieur de la classe. c'est l'une des exigences de la classe J'ai l'opérateur double() qui fait le typecasting (même si wheaties dit qu'il est mauvais, le professeur le voulait) et j'ai un qui est défini en dehors de la classe. et un autre construit dans l'opérateur C++ (double, int) apparemment le programme ne peut pas choisir celui à appeler :( –

2

La raison pour laquelle vous obtenez l'erreur de surcharge ambiguë est que vous avez operator+ variantes qui peuvent ajouter deux Complex ou un Complex et un double, mais vous essayez d'ajouter un Complex et un int. Le compilateur ne peut pas décider s'il est préférable de convertir le int en Complex pour utiliser le premier ou le double et utiliser le second.

Pour éviter cela, vous devez soit définir une surcharge operator+ pour tous les types possibles que vous pouvez ajouter à un Complex (int, float, long, non signé ...) OU surchargez pas operator+ en premier lieu - juste définir un SIMPLE operator+ qui ajoute deux Complex et laisser les conversions de type traiter tous les autres cas.