Seite 1 von 1
friend class - führt zu fehlermeldung
Verfasst: 13. April 2012 19:26
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
Re: friend class - führt zu fehlermeldung
Verfasst: 13. April 2012 20:06
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
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.
Re: friend class - führt zu fehlermeldung
Verfasst: 14. April 2012 14:16
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
Re: friend class - führt zu fehlermeldung
Verfasst: 14. April 2012 14:49
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.
Re: friend class - führt zu fehlermeldung
Verfasst: 16. April 2012 20:01
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
Re: friend class - führt zu fehlermeldung
Verfasst: 17. April 2012 09:24
von brax
Das ist eine Klassen Definition. Die reine Deklaration wäre
Innerhalb der Klassen Definition ist die Deklaration der Methode run().
Re: friend class - führt zu fehlermeldung
Verfasst: 17. April 2012 10:36
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