Frage

Ich habe eine Klasse, die eine Struktur verwendet, und ich möchte für diese Struktur den << Operator zu überlasten, sondern nur innerhalb der Klasse:

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);
}

Ich kann nur kompilieren, wenn ich den Operator << Überlastung w / der Freund Schlüsselwort deklarieren, aber dann wird der Operator überall in meinem Code, nicht nur in der Klasse überlastet. Wie kann ich überlasten den Operator << für my_struct nur innerhalb der Klasse?

Edit: Ich möchte den überladenen Operator verwenden, um eine my_struct zu drucken, die ein Mitglied der my_class IS

War es hilfreich?

Lösung

  

Wie kann ich überlasten den Operator << für my_struct nur innerhalb der Klasse?

definiert es als

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

oder

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

in der .cpp Datei, in der Sie MyClass implementieren.

EDIT: Wenn Sie wirklich, wirklich auf die Klasse Umfang benötigen und sonst nichts, dann definieren sie als eine private statische Funktion in der Klasse. Es wird nur in dieser Klasse in Umfang und deren Unterklassen. Es wird alles andere benutzerdefinierte operator<< die für unabhängige Klassen, obwohl (auch hier nur innerhalb der Klasse, und es ist Subklassen), definiert verstecken, wenn sie nicht mit ADL gefunden werden kann, oder sind Mitglieder von std::ostream bereits.

Andere Tipps

Verwenden Sie Betreiber nicht <<. Verwenden Sie eine benannte Member-Funktion, und machen es privat.

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

Beachten Sie die Struktur als konstante Referenz passieren sollte, je nachdem welche Methode Sie verwenden.

Edit: Es gibt keine Notwendigkeit, den Betreiber zu machen << ein Mitglied der Klasse nur so können Sie es verwenden, um ein Mitglied der Klasse zu drucken. Sie können es ein Freund der Struktur machen, oder eine völlig freie Funktion, die die Klasse dann verwendet wird.

Wenn „nur in der my_class überlastet“ meinen Sie nur sichtbar / verwendbar durch meine Klasse, die Sie ein Nicht-Mitglied Überlastung verwenden könnte, die nur sichtbar für my_class ist. Z.

   struct my_struct {
      int a;
      char c;
   };

   class My_Class
   {
      publiC:
         My_Class();
   }

Dann in My_Class.cpp:

namespace {
    ostream& operator(ostream& os, const my_struct& mystruct ) {
         os << mystruct.a << mystruct.c;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top