Mehrere Methoden einer durch '?'-Operator gewählten Klasse aufrufen
-
Hallo,
irgendwie hatte ich mich ja von Anfang an in diese '?' - Konstrukte verliebt.
Auch wenn sie nur eine gekürzte if-then-else Form darstellen, ist es doch erstaunlich, wieviele Befehle sich in eine Zeile Code packen lassenAber was mir nicht gelingt, ist folgendes:
Ich habe ein vector<string> und ein vector<bool>.
Je nach Wahrheit des zugehörigen Boolean soll der jeweilige String in die linke oder rechte Listbox einsortiert werden.for (int i=0;i<vc_strColNames.size();i++) ((vc_bColIsNum[i]) ? m_ValueListbox : m_NameListbox).AddString(vc_strColNames[i]);
Das klappt wunderbar.
Um den Bogen aber noch weiter zu spannen, möchte ich nun noch eine zweite Methode aufrufen (in dem Fall SetItemData(i)).
Also in etwa:for (int i=0;i<vc_strColNames.size();i++) ((vc_bColIsNum[i]) ? m_ValueListbox : m_NameListbox).AddString(vc_strColNames[i]),.SetItemData(i);
Das schluckt er aber nicht. Fällt da jemanden was ein.
Das einzige, was mir noch einfiele, wär statt der direkten Objektnamen einen Pointer zu setzen und dann im nachfolgenden Block, die Methoden über -> aufzurufen.P.S.:
Natürlich weiß ich, dass ich mit einem if-then-else - Konstrukt besser dastünde, aber mich interessiert das jetzt einfach mal.
-
entweder du machst das mit einer Temporären Referenz/Pointer oder du baust die Anweisungen in ?:-ein
a ? b.x(),b.y() : d.x(),d.y();
P.S.:
Natürlich weiß ich, dass ich mit einem if-then-else - Konstrukt besser dastünde, aber mich interessiert das jetzt einfach mal.jo, dein Code wird so recht unleserlich. ?: lohnt sich nur bei extrem alten Compilern oder wenn es darum geht token zu sparen, weil man bei einem Coding Contest mitmacht und bei Zuweisungen ist es auch noch zu verkraften.
-
Ok, danke erstmal.Das mit der temp. Referenz klingt schonmal gut.
Aber das hier wäre die Form, die ich bei eine if-then-else Geschichte nutze:
kingruedi schrieb:
a ? b.x(),b.y() : d.x(),d.y();
Meinst du, man könnte eventuell irgenwie die (.x,.y) "ausklammern"? Also so in etwa:
a ? (b:d).x(),.y();
So dass auf jedenfall noch y() aufgerufen wird für entweder b oder d ?
-
nein, dass geht nicht.
Obwohl wenn wir eh schon so weit sind, dann macht das
#define APPLY_2(object,mem1,mem2) object.mem1; object.mem2 APPLY_2( a ? b : c, x(),y());
auch nichts mehr
(btw. aber wo ist der Sinn? if-else dürfte nebenbei auch noch schneller und natürlich leserlicher sein, als so ein rumgefrikel mit temp variablen und co oder so Macro Zeugs)
-
Ja klar, Sinn hat das nicht sehr viel.
War mehr eine grundlegende Frage, also mehr Grundlagenforschung
Normalerweise finde ich if-else auch leserlicher.
Ich schreibs jetzt mal mit Pointern um.Danke dir