Hallo,
Ich versuche gerade meine C++ Kenntnisse aufzufrischen. Dabei bin ich
auf folgendes Szenario gestoßen.
Ich habe eine Klasse A, von der im Hauptprogram zwischen 1 und 10
Instanzen erzeugt werden. Klasse A enthält eine Memberfunktion, die auf
Daten aus einer Tabelle zugreifen muss. Die Tabelle hat eine Größe von
10 x 5 in der konstannte Parameter eingespeichert sind. (Die n-te
Instanz von Klasse A soll die Parameter aus der n-ten Zeile der Tabelle
entnehmen.)
Nun stellt sich mir die Frage wie, bzw. wo ich die Tabelle am besten
deklariere und initialisiere! Meine bisherige Lösung sieht in etwa wie
folgt aus. Meine Frage ist allerdings ob man das Problem irgendwie
besser lösen kann.
Wenn die Tabelle wirklich konstant ist, hast du schon einen geeigneten
Ort gefunden, um sie abzulegen. Es macht ggf. Sinn, sie in eine eigene
Headerdatei auszulagern und ihr einen Namespace zu geben.
Wenn sich die Werte nie ändern sollen, würde ich Peter II's Vorschlag
wählen, und die Zeilennummer im Konstruktor übergeben und in einer
Instanzvariable speichern.
1
A::A(unsignedintn){
2
myN=n;
3
}
4
5
voidA::zugriffAufParam(){
6
for(inti=0;i<5;++i){
7
tuWasMit(param[myN][i]);
8
}
9
}
Sollen sich die Werte nach der Zuordnung ändern können (z.B. für
adaptive Filter) müssen sie eben in einen eigenen std::vector oder ein
Array übertragen werden.
Hallo Michael,
Michael N. schrieb:> Nun stellt sich mir die Frage wie, bzw. wo ich die Tabelle am besten> deklariere und initialisiere!
wenn Du sie nur in einer Funktion benötigst, dann würde ich sie auch
genau nur dort deklarieren. Das hat den Vorteil, dass Du einen knappen
Namen wählen kannst und dass dieser Name dann auch ausserhalb der
Funktion nicht sichtbar ist.
Di P. schrieb:> und die Zeilennummer im Konstruktor übergeben und in einer> Instanzvariable speichern.
Ich würde etwas weiter gehen und eine const-Referenz auf die Zeile
übergeben und als Instanzvariable speichern. Das würde die Abhängigkeit
von A von der Tabelle deutlicher beschreiben als eine Zahl, die sich auf
irgendwelche globalen Daten, die irgendwie auch irgendwo vorhanden sein
müssen, bezieht. Da die Referenz nur auf existierende Zeilen zeigen
kann¹, würde sich auch das Problem der Bereichsüberprüfung für die
Zeilennummer im Konstruktor lösen. Die wird bei näherer Betrachtung
nämlich hässlich: Lässt man n=23 durchgehen und überlässt dem Aufrufer
die Verantwortung? Exception aus dem Konstruktor? Still und leise auf
legale Werte beschränken? Aufpassen und beten?
¹solange man sich nicht besondere Mühe gibt.
Tom schrieb:> Ich würde etwas weiter gehen und eine const-Referenz auf die Zeile> übergeben und als Instanzvariable speichern. Das würde die Abhängigkeit> von A von der Tabelle deutlicher beschreiben als eine Zahl, die sich auf> irgendwelche globalen Daten, die irgendwie auch irgendwo vorhanden sein> müssen, bezieht.
Irgendwie blicke ich nicht ganz durch wie ich die Zeile als
const-referenz übergeben kann. Wie sieht denn die entsprechende
deklaration aus?
Ich habs mit
1
A(constdouble(&ab[5]));
versucht, aber der Compiler meldet sich dann mit der Meldung:
S. J. schrieb:> const double array reference mit 5 werten:> f(const double (&array)[5]);
Danke, so funktioniert es! Allerdings wird das von Tom beschrieben
Problem:
Tom schrieb:> Da die Referenz nur auf existierende Zeilen zeigen> kann¹, würde sich auch das Problem der Bereichsüberprüfung für die> Zeilennummer im Konstruktor lösen.
dadurch auch nicht wirklich gelöst.
Die Zeile
1
n=12;
2
Stage(coeff::ai[n],coeff::bi[n])
kann im Programm so ausgefürht werden und liefert dann halt irgedwelchen
Käse, da ai[12] und bi[12] eigentlich schon außerhalb des
Speicherbereichs liegen.
Ich sehe bei der Aufgabenstellung nur einen Parameter: Ein integer
zwischen 0 und 10. Ausgabewert ist ein double. Dafür muss man kein
Klassengerüst bauen. Alles was es an public Funktionen braucht ist bspw:
1
doublemagic(unsigned);
Die (pseudo) Implementierung könnte dann folgendermaßen aussehen...
Michael N. schrieb:> dadurch auch nicht wirklich gelöst.
Du hast völlig recht, der Koffeinspiegel war zu weit abgesunken und ich
habe Mist geschrieben. Das Gefummel mit std::get oben in hip.cpp würde
das lösen, aber die Template-Hölle des modernen C++ ist nicht jedermans
Sache...
Michael N. schrieb:> Ich versuche gerade meine C++ Kenntnisse aufzufrischen. Dabei bin ich> auf folgendes Szenario gestoßen.>> Ich habe eine Klasse A, von der im Hauptprogram zwischen 1 und 10> Instanzen erzeugt werden. Klasse A enthält eine Memberfunktion, die auf> Daten aus einer Tabelle zugreifen muss. Die Tabelle hat eine Größe von> 10 x 5 in der konstannte Parameter eingespeichert sind. (Die n-te> Instanz von Klasse A soll die Parameter aus der n-ten Zeile der Tabelle> entnehmen.)>> Nun stellt sich mir die Frage wie, bzw. wo ich die Tabelle am besten> deklariere und initialisiere! Meine bisherige Lösung sieht in etwa wie> folgt aus. Meine Frage ist allerdings ob man das Problem irgendwie> besser lösen kann.
Vielleicht mit statischen Membervariablen. Dann merkt sich Deine Klasse
im Konstruktor, die wievielte Instanz von ihr erzeugt wurde, und greift
auf die entsprechende Zeile des config-Arrays zu:
Eine andere Lösung steckt die Konfigurationszeilen in eine deque, pop()t
sich im Konstruktor ihre Konfigurationszeile vom Anfang der deque (und
push()t sie gegebenenfalls in Destruktor wieder hinten dran):