2010-10-10 4 views
1

Je classe abstraite:binaire de surcharge +

#include <string> 

using namespace std; 

class AString 
{ 
    public: 
     virtual ~AString() {} 

     virtual const string& GetName() const = 0; 
     virtual const string& GetValue() const = 0; 
     virtual const int GetSize() const = 0; 
}; 

et la classe dérivée. J'essaie de surcharger + binaire dans cette classe:

class SymbString : public AString 
{ 
    private: 
     string name; 
     string val; 

    public: 
     SymbString() {} 

     SymbString(string _name) : name(_name) {} 

     SymbString(string _name, string _val) : name(_name), val(_val) {} 

     const string& GetName() const { return name; } 

     const string& GetValue() const { return val; } 

     const int GetSize() const { return val.size(); } 

     const string& SetValue(string value) 
     { 
      val = value; 
      return val; 
     } 

     SymbString operator + (const SymbString &str1, const SymbString &str2) 
     { 

     } 

}; 

Mais voir erreur: opérateur SymbString + (const SymbString & str1, const SymbString & str2) doit prendre zéro ou un argument

Quel est le problème ?

Merci.

Répondre

2

Vous devez le placer dans l'espace de noms englobant SymbString. Pas en tant que membre.

Ou en tant que membre, mais seulement en spécifiant le bon paramètre. Mais alors "Hello" + symb ne fonctionnera plus, parce que le côté gauche n'est pas un SymbString. Il est donc conseillé de l'écrire en tant que non-membre dans l'espace de noms SymbString.

Notez que pour pouvoir à dire symb + "Hello" ou dans l'autre sens autour de l'écriture ou même SymbString s = "Hello";, vous devez également accepter un char const* comme paramètre constructeur. Sinon, un char const* ne sera pas implicitement convertible en un SymbString car cela nécessitera d'abord de le convertir en std::string puis de le convertir en SymbString. Deux conversions définies par l'utilisateur ne sont pas autorisées dans une seule séquence de conversion implicite.

+0

Oui, c'est dans SymbString, j'écris donc dans stackoverflow pour la compréhensibilité – 0xAX

2

Vous le définissez en tant que méthode d'instance. Cela signifie que l'opérande gauche sera le récepteur (this) et l'opérande de droite sera l'argument de la fonction.

Si vous souhaitez que les deux opérandes soient des arguments, vous devez définir la méthode comme statique ou comme fonction en dehors de la classe.

1

Je suppose que vous essayez d'introduire operator+ en tant que fonction membre de la classe. C'est faux. Définissez-le comme une fonction gratuite. Ou avoir operator+= en tant que membre et mettre en œuvre la fonction libre operator+ grâce à cela.