PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ist das legal?


Standart c++
2003-11-01, 11:05:59
class foo
{
typedef void (bar)(int a, int b, int c);
virtual bar foobar {}
};

Standart c++
2003-11-01, 19:27:39
ist hier kein kompetenter c++er?

Tom Servo
2003-11-01, 19:35:04
Was willst du eigentlich genau wissen? Frag doch den Compiler, der müsste dir einige Tips geben können:



class foo
{
protected:
typedef void (*bar)(int a, int b, int c);
virtual bar foobar() { return 0; }
};

class D: private foo {
virtual bar foobar() { return 0; }
};

oder auch:

class foo
{
public:
typedef void (*bar)(int a, int b, int c);
virtual bar foobar() { return 0; }
};

class D: public foo {
virtual bar foobar() { return 0; }
};

Demirug
2003-11-01, 19:56:28
Wenn man es von der syntax her richtig schreibt (so wie Tom Servo) ist das natürlich legal.

Aber jeder der sowas macht muss schon einen verdammt guten Grund für so einen Blödsinn haben.

Funktionszeiger sind ja schon allgemein ein üble aber eine virtuelle Methode einen Funktionszeiger zurückgeben zu lassen ist schon extrem heftig.

Xmas
2003-11-01, 19:56:28
Original geschrieben von Standart c++

class foo
{
typedef void (bar)(int a, int b, int c);
virtual bar foobar {}
};


Falls du dies als andere Schreibweise für

class foo
{
virtual void foobar(int a, int b, int c) {}
};

meinst: Ja (ich war selbst erstaunt darüber dass es funktioniert). Allerdings ist das ziemlich verwirrend und man sollte es nur in Ausnahmefällen (wenn eine ganze Reihe von Methoden dieselbe, lange Signatur hat) verwenden.

Gnafoo
2003-11-01, 20:22:38
Original geschrieben von Standart c++

class foo
{
typedef void (bar)(int a, int b, int c);
virtual bar foobar {}
};


und wenn er nen Funktionspointer zurückgeben will .. müsste das
dann net eigentlich
typedef void (*bar)(int a, int b, int c);
heißen ?

StandarT
2003-11-01, 20:27:02
Original geschrieben von Xmas
Falls du dies als andere Schreibweise für

class foo
{
virtual void foobar(int a, int b, int c) {}
};

meinst: Ja (ich war selbst erstaunt darüber dass es funktioniert). Allerdings ist das ziemlich verwirrend und man sollte es nur in Ausnahmefällen (wenn eine ganze Reihe von Methoden dieselbe, lange Signatur hat) verwenden. jo! danek.


@others: KEIN funktionsponter!

Tom Servo
2003-11-01, 22:23:43
Vielleicht macht dieses Syntax ja irgendwelchen Sinn in Verbindung mit Templates. Da kommt es ja nicht auf Lesbarkeit an. Weiss jetzt aber auch keine konkrete Anwendung.

Mein gcc-3.2 hier möchte das aber gar nicht compilieren. Da so ein Feature vmtl. nicht erst vor kurzem hinzugefügt wurde, wundert mich das schon etwas.

make -k test10.o
g++ -c -o test10.o test10.cpp
test10.cpp:4: syntax error before `{' token
test10.cpp:4: missing ';' before right brace
make: *** [test10.o] Error 1


edit: Mich wundert auch, dass man die Parameter im Funktions-Body über die im typedef verwendeten Namen ansprechen können soll. Da ein typedef auch mehrfach vorkommen kann, was passiert, wenn die Namen nicht bei beiden typedefs gleich sind?

edit2: Mit dem Microsofts C-Compiler: Man kann wirklich die Parameter benutzen. Ein mehrfaches typedef führt sofort zu einer Fehlermeldung unexpected type foo::bar.

Tom Servo
2003-11-02, 13:14:35
Wenn man den Code umschreibt, dann nimmt auch gcc-3.2 es an. Auch mehrfache typedef sind für ihn kein Problem:


class foo
{
typedef void bar (int a, int b, int c);
typedef void bar (int a, int b, int c);
typedef void bar (int aa, int bb, int cc);
virtual bar foobar;
};


void foo::foobar (int a, int b, int c)
{
int n = a;
}




Vom Gefühl her würde ich sagen, dass die Originale Schreibweise vielleicht nicht so im Standard steht.

Wenn das ganze nur eine Quizfrage war, warte ich mal auf die Auflösung. Habe irgendwie keine Idee im welchem Teil des Standards das genau steht. Unter typedef bei cplusplus.com habe ich es nicht gefunden.

Wenn es kein Quiz war, solltest du in der Newsgroups comp.lang.c++.moderated fragen. Da sollte man sowas auf jeden Fall wissen und auch ein Zitat aus dem Standard parat haben.

fakie
2003-11-15, 00:13:41
Was genau passiert denn bitte bei dieser Funktion??

Xmas
2003-11-15, 03:36:20
Bei welcher?