Hier tauchen zwei Fehler auf, einer kommt vom Visual Studio, das
unterkingelt mir das Rückgabe-void mit dem Fehlertext:
"der Ausdruck vor den Klammern des sichtbaren Aufrufs muss einen
Funktionstyp (pointer-to-) aufweisen"
Der Compiler meldet mir folgenden Fehler:
"void value not ignored as it ought to be"
Wenn ich die void durch int ersetze, und natürlich für in die Funktion
ein return 0 einbaue, erhalte ich vom Visual Studio die gleiche
Fehlermeldung, der Compiler meldet allerdings:
"expression cannot be used as a function".
Was mache ich hier falsch?
Matthias S. schrieb:
Hallo Matthias,
> void(*FuncPtr)() = NULL;
diese Art der Initialisierung gibt es erst seit C++11.
> Klasse = Class(foo, void (*Funktion)()) /<<<<Fehler
Du must hier zwischen der Deklaration eines Parameters von Typen: "Ist
Funktion, die keine Argumente nimmt und nix zurück gibt" und der
Übergabe eins konkreten Werts beim Aufruf unterscheiden. Der erst
Parameter ist von Typen int. Dort übergibst Du doch auch einfach einen
int:
Och man... manchmal sieht man den Baum vor lauter Bäumen nicht. Und wenn
man sich mit vorherigen Experimenten auch noch selbst eine Falle
stellt...
Das wars, danke!
Wenn man Funktionspointer konsequent weg-typedeft, dann steht die
ekelhafte Syntax nur an einer Stelle und der Rest des Programms bleibt
davon verschont:
Vincent H. schrieb:> Die leserlichste Form einer Typdefinition eines Funktionszeigers bekommt> man imho via> using VoidFp = auto (*)() -> void;
Ist das ironisch gemein? Da ist ja gegenüber einer normalen
Funktionsdefinition alles verdreht.
Rolf M. schrieb:> Vincent H. schrieb:>> Die leserlichste Form einer Typdefinition eines Funktionszeigers bekommt>> man imho via>> using VoidFp = auto (*)() -> void;>> Ist das ironisch gemein? Da ist ja gegenüber einer normalen> Funktionsdefinition alles verdreht.
Nein das mein ich ernst. Ich schreib gern C++ Code aber der Purist in
mir sieht Rückgabewerte lieber am Ende einer Definition.
Matthias S. schrieb:> Namespace::Class Klasse;>> void setup()> {> Klasse = Class(foo, void (*Funktion)())
Dir ist klar, dass du hier erst eine "leere" Instanz anlegst, und dann
in der main() eine temporäre zweite Instanz, und die über die erste
kopierst? Einfacher (und effizienter) wäre so:
1
Namespace::ClassKlasse(foo,Funktion);
2
intmain(){
3
...
4
}
So brauchst du auch den Standard Konstruktor nicht mehr.
Die Instanz einer Klasse nennt man übrigens Objekt, und nicht Klasse...
Matthias S. schrieb:> void(*FuncPtr)() = NULL;
NULL ist veraltet, bitte nullptr nutzen...
Tom schrieb:> Wenn man Funktionspointer konsequent weg-typedeft, dann steht die> ekelhafte Syntax nur an einer Stelle und der Rest des Programms bleibt> davon verschont:>
1
>classClass
2
>{
3
>public:
4
>typedefvoid(*tVoidFunc)();
5
>Class(intvalue,tVoidFuncfp):m_fp(fp){}
6
>private:
7
>tVoidFuncm_fp;
8
>};
9
>
10
>voidmyfunc(){}
11
>
12
>intmain(){
13
>Classc(23,myfunc);
14
>return0;
15
>}
16
>
Danke.
Jetzt habe ich verstanden, warum bei der Verwendung von typdef immer von
"Vereinfachung" gesprochen wird.
Matthias S. schrieb:> Jetzt habe ich verstanden, warum bei der Verwendung von typdef immer von> "Vereinfachung" gesprochen wird.
Typisches Beispiel dafür ist die Standard-C-Funktion signal():