friend class - führt zu fehlermeldung

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
QuornJulio
Beiträge: 26
Registriert: 8. Dezember 2011 21:57

friend class - führt zu fehlermeldung

Beitrag von QuornJulio »

hallo,

ich habe folgende Klasse erstellt:

Code: Alles auswählen

class Person {
public:
	Person();
	virtual ~Person();

protected:
	friend class Zivil {
		Zivil();
		virtual ~Zivil();

		private:
		const char* name;
	};
};
und kriege folgende fehlermeldung, die ich leider nicht so ganz verstehe.

../src/Person.hpp:17:2: error: class definition may not be declared a friend

vielleicht könnt ihr mir auf die sprünge helfen.
dank im voraus.

QuornJulio
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: friend class - führt zu fehlermeldung

Beitrag von franzf »

Im Standard, Kapitel 11.3:
A class shall not be defined in a friend declaration. [ Example:

Code: Alles auswählen

class A {
friend class B { }; // error: cannot define class in friend declaration
};
Erlaubt ist bei Klassen nur eine Deklaration

Code: Alles auswählen

class A {
friend class B;
};
Methoden dürfen hingegen direkt definiert werden:
A function can be defined in a friend declaration of a class if and only if the class is a non-local class (9.8),
the function name is unqualified, and the function has namespace scope.

Code: Alles auswählen

class M {
friend void f() { }
};
QuornJulio
Beiträge: 26
Registriert: 8. Dezember 2011 21:57

Re: friend class - führt zu fehlermeldung

Beitrag von QuornJulio »

hallo franzf,

danke für den hinweis.
ich habe die cpp bibliothek cppsocket testen wollen.
http://sourceforge.net/projects/cppsocket/

in dem header "tcpthreadedserver.h" fand ich dann folgendes vor:

Code: Alles auswählen

    friend class TCPListen : public Thread
    {
    public:
      TCPThreadedServer* server;
      bool listen;

      /// This method runs in an own thread.
      void run();
    };

    /// The listen-thread.
    TCPListen* listener;
das gibt dann einem zu denken.
ich dachte jedenfalls, dass diese art der deklaration auch möglich wäre.

gruss
QuornJulio
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: friend class - führt zu fehlermeldung

Beitrag von franzf »

Mein gcc-4.6.2 ist da auch ganz strikt - keine friend Definition.
Wobei hier friend eh überflüssig ist. Nested classes liegen im scope der umschließenden Klasse und haben somit Zugriff auf deren private Member.
Probiers aus:

Code: Alles auswählen

class Test {
    int x;
public:
    struct Inner {
        void check(Test& t) {
            t.x=55;
        }
    };
};

int main() {
    Test t;
    Test::Inner ti;
    ti.check(t);
}
AFAIK wurde das erst mit c++11 im Standard aufgenommen, gcc (und andere) haben das aber auch schon vorher so umgesetzt.
QuornJulio
Beiträge: 26
Registriert: 8. Dezember 2011 21:57

Re: friend class - führt zu fehlermeldung

Beitrag von QuornJulio »

hallo franzf,

danke für den code zum testen.

nur mal so ne frage am rande - ist das eine definition oder eher eine deklaration?

Code: Alles auswählen

friend class TCPListen : public Thread {
    public:
      TCPThreadedServer* server;
      bool listen;

      /// This method runs in an own thread.
      void run();
    };
gruss
QuornJulio
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: friend class - führt zu fehlermeldung

Beitrag von brax »

Das ist eine Klassen Definition. Die reine Deklaration wäre

Code: Alles auswählen

class TCPListen;
Innerhalb der Klassen Definition ist die Deklaration der Methode run().
QuornJulio
Beiträge: 26
Registriert: 8. Dezember 2011 21:57

Re: friend class - führt zu fehlermeldung

Beitrag von QuornJulio »

hallo brax,

danke für die antwort.
die deklaration der methode run() hat bei mir die frage aufkommen lassen.
also ob klassen-deklaration oder klassen-definition.
jetzt weiß ich es ;-)

gruss
QuornJulio
Antworten