Question

J'ai une classe qui utilise une structure et je souhaite surcharger le fichier < < opérateur pour cette structure, mais uniquement dans la classe:

typedef struct my_struct_t {
  int a;
  char c;
} my_struct;

class My_Class
{
  public:
    My_Class();
    friend ostream& operator<< (ostream& os, my_struct m);
}

Je ne peux compiler que lorsque je déclare l'opérateur < < overload w / the friend mot-clé, mais l'opérateur est surchargé partout dans mon code, pas seulement dans la classe. Comment surcharger le < < opérateur pour my_struct UNIQUEMENT dans la classe?

Éditer: je souhaiterai utiliser l'opérateur surchargé pour imprimer un my_struct qui EST membre de My_Class

Était-ce utile?

La solution

  

Comment surcharger le fichier < < opérateur pour my_struct UNIQUEMENT dans la classe?

Définissez-le comme

static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...

ou

namespace {
    std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}

dans le fichier .cpp dans lequel vous implémentez MyClass .

MODIFIER: si vous avez réellement besoin de la portée de la classe, définissez-la comme une fonction statique privée dans ladite classe. Il ne sera concerné que par cette classe et ses sous-classes. Il va masquer tous les autres opérateurs personnalisés < < définis pour des classes non liées, bien que (encore une fois, uniquement à l'intérieur de la classe et de ses sous-classes), à moins qu'ils ne puissent être trouvés avec ADL, ou qu'ils soient membres de std :: ostream déjà.

Autres conseils

N'utilisez pas l'opérateur < < ;. Utilisez une fonction membre nommée et rendez-la privée.

class My_Class
{
  public:
    My_Class();
 private:
    void Print( ostream & os, const my_struct & m );
};

Notez que vous devez transmettre la structure en tant que référence const, quelle que soit la méthode utilisée.

Modifier: Il n'est pas nécessaire de demander à l'opérateur < < un membre de la classe afin que vous puissiez l'utiliser pour imprimer un membre de la classe. Vous pouvez en faire un ami de la structure, ou une fonction complètement libre, que la classe utilise ensuite.

Si par "uniquement surchargé dans la classe" " vous voulez dire uniquement visible / utilisable par ma classe, vous pouvez utiliser une surcharge non-membre visible uniquement par My_Class. Ex.

   struct my_struct {
      int a;
      char c;
   };

   class My_Class
   {
      publiC:
         My_Class();
   }

Puis dans My_Class.cpp:

namespace {
    ostream& operator(ostream& os, const my_struct& mystruct ) {
         os << mystruct.a << mystruct.c;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top