2016-07-09 16 views
1

Here (siehe Punkt 2 Beschreibung) Ich habe gelesen, dass eine Freund-Funktion in-Class-Definition nur in nicht-lokale Klassen-Definition erlaubt ist.Friend-Funktion in-Class-Definition nur in nicht-lokalen Klassendefinitionen zulässig. Was heißt das?

Was bedeutet das?

+1

Ihre Frage ist unklar und missgebildet. Links sind kein Ersatz für Inhalte. – Amit

+0

Ich denke, ist sehr präzise und in sich abgeschlossen, ist die Verbindung nicht wirklich notwendig, um die Frage zu verstehen. Tatsächlich habe ich die Antwort erhalten, die ich in weniger als 1 Minute suchte. –

+0

Die Antworten, die Sie bekommen haben, erklären alle, was eine lokale Klasse ist - das ist nicht, was Ihre Frage fragt. Es ist schön, dass du die Antwort bekommen hast, die du brauchst, aber die Frage ist immer noch falsch. – Amit

Antwort

2

Nicht lokale Klasse ist eine Klasse, die nicht lokal ist.

Eine lokale Klasse ist eine Klasse in einer Funktion definiert - Absatz „Lokale Klassen“ on this page

„Friend-Funktion in-Class-Definition“ bezieht sich auf die Fähigkeit sehen eine Nicht-Elementfunktion innerhalb einer Klasse zu erklären und zu definieren, das ist ein Freund der Klasse in eingeschlossen ist.

class a_class 
{ 
    friend std::ostream& operator<<(std::ostream& os, const a_class& x) 
    { 
     // ... 
    } 
}; 
+0

Erhalten 3 fast gleichwertige Antworten. Ich akzeptiere einfach den ersten. –

1

eine nicht-lokale Klassendefinition ist eine Definition, die nicht in anderer Klasse Körper definiert ist oder es nicht in einem Funktionskörper eingebettet.

Also im Grunde können Sie dies tun:

#include <iostream> 

struct NonLocal 
{ 
    friend std::ostream& operator<<(std::ostream& os, const NonLocal& l) 
    { 
    os << l.x; 
    return os; 
    } 

private: 
    int x; 
}; 

int main() 
{ 
    NonLocal nl; 
    std::cout << nl; 
} 

Sie können dies aber nicht tun:

#include <iostream> 

int main() 
{ 
    struct Local 
    { 
    friend std::ostream& operator<<(std::ostream& os, const Local& l) // this will fail to compile 
    { 
     os << l.x; 
     return os; 
    } 

    private: 
    int x; 
    }; 

    Local l; 
    std::cout << l; 
} 

Vom cppreference.com:

Eine Klassendeklaration in Namespace Umfang erscheinen können (In diesem Fall definiert eine gewöhnliche Klasse), innerhalb einer anderen Klassendefinition (in der Fall definiert es eine verschachtelte Klasse), und innerhalb des Rumpfes einer Funktion, in , welche Fall definiert es eine lokale Klasse. Der Name einer solchen Klasse nur existiert innerhalb des Funktionsumfangs und ist außerhalb nicht zugänglich.

  • Eine lokale Klasse statische Mitglieder nicht
  • Mitglied Funktionen einer lokalen Klasse haben keine Verbindung
  • Mitglied Funktionen einer lokalen Klasse ganz
  • Lokale Klassen andere in der Klasse Körper werden müssen definiert sein kann als Closure-Typen (seit C++ 14) können keine Member-Vorlagen haben
  • Lokale Klassen dürfen keine Freundschablonen haben
  • Eine lokale Klasse innerhalb einer Funktion (einschließlich Elementfunktion) kann auf dieselben Namen wie th zugreifen Die umschließende Funktion kann zugreifen.
  • lokale Klassen nicht als Template-Argumente (bis C++ 11)

[Hervorhebung von mir]

0

Es verwendet werden könnte, bedeutet, dass Sie dies nicht tun können:

void function() 
{ 
    class X 
    { 
     int a; 
     friend void friend_set(X& p, int i) 
     { 
      p.a = i; 
     } 
     public: 
     void member_set(int i) 
     { 
      a = i; 
     } 
    }; 
} 

Lokale Klassen sind diejenigen, die innerhalb einer Funktion definiert sind.