Schönen guten Abend,
in versuche recht neu in c++ einzusteigen und stehe derzeit vor einem
Problem. Allgemein versuche ich die wieder Verwendbarkeit des Codes im
Auge zu behalten.
Ziel: Es soll ein Modul geschrieben werden, welches nur an einer Stelle
angepasst werden muss und dann dementsprechend für andere Projekte
verwendet werden kann. Diese Prüfungen sind nicht statisch und können
sich selbst bei einer Variante, je nach der Konfiguration unterscheiden.
Bei mir geht es um eine typische Busverbindung mit Index basierenden
Zugriff.
Ich habe dazu einmal eine stark vereinfachte Klasse geschrieben. Diese
hat derzeit 2 Check Funktionen (biggerCheck und smallerCheck). Es soll
jetzt in der Hauptfunktion eine Idee und 2 Zahlen übergeben werden und
die Funktion schaut nach ob der Eintrag in der Parameter Liste vorhanden
ist und führt die hinterlegte Check Funktion aus.
Wenn ich dies versuche zu Kompilieren erhalte ich die Meldung:
Also werde ich etwas bei der Definition oder beim Aufrufen verkehrt
gemacht werden, ich komme derzeit jedoch nicht weiter. Ich hatte ebenso
die Meldung bei der Schreibweise:
1
ret=myParameterSet[i].Checker(num1,num2);
Kann mir dort vielleicht einer kurz auf die Sprünge helfen?
Auf welcher Instanz von "ParameterTest" soll denn "Checker" aufgerufen
werden? Du musst eine Instanz angeben, wenn du einen
Member-Funktions-Zeiger aufrufen willst.
Wenn der Aufruf ohne Instanz erfolgen soll, mach die Funktionen "static"
und verwende normale Funktions-Zeiger statt Member-Funktions-Zeiger.
Der Checker soll voraussichtlich in einer Klasse aufgerufen werden,
welche alle Information von ParameterTest erbt.
Mit statischen Funktionen funktioniert das Konstrukt in c recht einfach.
Jetzt muss ich jedoch auf gewisse Daten in andere Klassen bei mir in den
Checks zugreifen und das hätte ich versucht über friends zu lösen.
Stehe anderen Lösungen aber auch offen gegenüber.
Markus F. schrieb:> Jetzt muss ich jedoch auf gewisse Daten in andere Klassen bei mir in den> Checks zugreifen und das hätte ich versucht über friends zu lösen.
Das, und public/private, hat überhaupt nichts mit dem Problem zu tun. Es
geht nur darum, auf welcher Instanz die Funktion aufgerufen werden soll.
Wahrscheinlich ist Jemand's Lösung das was du suchst.
Markus F. schrieb:> bool biggerCheck(uint8_t num1, uint8_t num2)> {> bool ret;> if (num1 > num2)> {> ret = true;> }> else> {> ret = false;> }> return(ret);> }
Auch wenn das vielleicht nur ein Beispiel ist, aber
return num1 > num2;
ist mehr als ausreichend und verständlich
Arc N. schrieb:> Etwas moderner darf die Lösung schon sein oder darf/kann nur C++ vor> C++11 verwendet werden?
Vielen Dank, die Lösung gefällt mir auf anhieb besser. Ich hatte mich
derzeit noch daran gescheut Funktionen aus der STL zu nehmen, da ich
gerade erst angefangen habe, mich in dieser einzuarbeiten.
Ich bin derzeit am schauen, scheinbar unterstützt der GCC (V 6.3.1) aus
dem Atmel Studio C++11, also werde ich das gleich umbauen.
cppbert3 schrieb:>> bool biggerCheck(uint8_t num1, uint8_t num2)>> {>> bool ret;>> if (num1 > num2)>> {>> ret = true;>> }>> else>> {>> ret = false;>> }>> return(ret);>> }
als Reminder: das würde dir bei einem Review von jedem guten Entwickler
angekreidet werden
kannst auch
1
boolret=num1>num2;
2
returnret;
schreiben aber alles andere ist wirklich totaler murks - zeigt das dir
vielleicht nicht klar ist das num1 > num2 direkt auf bool evaluiert d.h.
dein Code sachen macht die der Kompiler genau so auch macht
cppbert3 schrieb:> Auch wenn das vielleicht nur ein Beispiel ist, aber>> return num1 > num2;>> ist mehr als ausreichend und verständlich
Woher kommt dieser Aberglaube, dass Code automatisch besser wird wenn
man ihn in weniger Zeilen quetscht? 🤔
Mark B. schrieb:> cppbert3 schrieb:>> Auch wenn das vielleicht nur ein Beispiel ist, aber>>>> return num1 > num2;>>>> ist mehr als ausreichend und verständlich>> Woher kommt dieser Aberglaube, dass Code automatisch besser wird wenn> man ihn in weniger Zeilen quetscht? 🤔
Man könnte genauso gut fragen:
Woher kommt dieser Aberglaube, dass Code automatisch besser wird wenn
man ihn in über mehr Zeilen verteilt? 🤔
Für mich ist
1
boolbiggerCheck(uint8_tnum1,uint8_tnum2)
2
{
3
returnnum1>num2;
4
}
deutlich besser lesbar als
1
boolbiggerCheck(uint8_tnum1,uint8_tnum2)
2
{
3
boolret;
4
if(num1>num2)
5
{
6
ret=true;
7
}
8
else
9
{
10
ret=false;
11
}
12
return(ret);
13
}
Vor allem wenn man bedenkt, dass sich biggerCheck und smallerCheck in
nur einem Zeichen unterscheiden.
Mark B. schrieb:> cppbert3 schrieb:>> Auch wenn das vielleicht nur ein Beispiel ist, aber>>>> return num1 > num2;>>>> ist mehr als ausreichend und verständlich>> Woher kommt dieser Aberglaube, dass Code automatisch besser wird wenn> man ihn in weniger Zeilen quetscht? 🤔
Nicht automatisch, aber in diesem Fall schon. Da wird auch nichts
gequetscht, sondern nur sinnloses Zeug weggelassen.
Die meisten Leute schreiben ja auch nicht
Markus F. schrieb:> Arc N. schrieb:>> Etwas moderner darf die Lösung schon sein oder darf/kann nur C++ vor>> C++11 verwendet werden?>> Vielen Dank, die Lösung gefällt mir auf anhieb besser. Ich hatte mich> derzeit noch daran gescheut Funktionen aus der STL zu nehmen, da ich> gerade erst angefangen habe, mich in dieser einzuarbeiten.>> Ich bin derzeit am schauen, scheinbar unterstützt der GCC (V 6.3.1) aus> dem Atmel Studio C++11, also werde ich das gleich umbauen.
Auf dem kleinen µC ist Vorsicht geboten bei der Verwendung von
std::function, das benötigt unter Umständen dynamisch allozierten
Speicher.
So wie es aussieht greifen smallerCheck und biggerCheck auf keine
Instanzvariablen oder -methoden zu, dann könnte man die beiden Methoden
also schon "static" machen, man benötigt dann auch keinen Zeiger auf die
Instanz mehr.
Mark B. schrieb:> cppbert3 schrieb:>> Auch wenn das vielleicht nur ein Beispiel ist, aber>>>> return num1 > num2;>>>> ist mehr als ausreichend und verständlich>> Woher kommt dieser Aberglaube, dass Code automatisch besser wird wenn> man ihn in weniger Zeilen quetscht? 🤔
Vielleicht weil diese 10 Zeilen exakt 0 Mehrwert bringen?
wenn die Menge des Code hier was "bringt" - warum dann nicht gleich die
Zeile und Zeichen-Maximierung?