[c++] Funktionsaufruf in if-anweisung
-
BTW: Das ist kein Funktionsaufruf, das ist eine Objektdefinition.
-
es sieht aus, als ob es eine Objektdefinition sein soll. Andererseits steht schon im topic was von Funktionsaufruf - vielleicht ist sich der OT selbst nicht ganz im klaren was er da anstellt?
-
ich vermute er will ein objekt je nach bedingung instanziern. da das objekt aber
im if-körper angelegt wird, ist es nur in diesem scope sichtbar.2 lösungsmöglichekeiten
int testfkttyp; cin >> testfkttyp; GABin2DecGenome genome(map, testfkttyp == 1 ? Objective1 : Objective2);int testfkttyp; cin >> testfkttyp; GABin2DecGenome genome; // setzt def-konstruktor und zuweisungsop vorraus if (testfkttyp == 1) genome = GABin2DecGenome(map,Objective1); else genome = GABin2DecGenome(map,Objective2);
-
oder er arbeitet mit zeigern...
ist aber was umständlicher wie ich finde...
int testfkttyp; cin >> testfkttyp; GABin2DecGenome *genome; if (testfkttyp == 1) genome = new GABin2DecGenome(map,Objective1); else genome = new GABin2DecGenome(map,Objective2); // berechnungen delete genome;
-
so gehts auch... Oder?
int testfkttyp; cin >> testfkttyp; GABin2DecGenome *genome = new GABin2DecGenome(map,() (testfkttyp == 1) ? Objective1 : Objective2); // berechnungen delete genome;[/quote]
-
Skym0sh0 schrieb:
oder er arbeitet mit zeigern...
ist aber was umständlicher wie ich finde...
int testfkttyp; cin >> testfkttyp; GABin2DecGenome *genome; if (testfkttyp == 1) genome = new GABin2DecGenome(map,Objective1); else genome = new GABin2DecGenome(map,Objective2); // berechnungen delete genome;Hat aber den Vorteil, dass
- genome auf verschiedene Objekte unterschiedlichen Typs (abgeleitet von GABin2DecGenome) zeigen kann,
- GABin2DecGenome weder default-konstruierbar noch zuweisbar (operator=()) zu sein braucht und
- bei sehr großen Klassen spart man Zeit, wenn man gleich "richtig konstruiert" und nicht erst def-konstr. und dann zuweist.
Überhaupt würde ich dem OP raten, sich mal anzusehen, ob hier nicht Polymorphie das Design entscheidend verbessern würde.
NochKuerzer schrieb:
so gehts auch... Oder?
int testfkttyp; cin >> testfkttyp; GABin2DecGenome *genome = new GABin2DecGenome(map,() (testfkttyp == 1) ? Objective1 : Objective2); // berechnungen delete genome;Das hat aber keine mir ersichtlichen Vorteile ggü. der oben genannten:
helferlein schrieb:
...
1.int testfkttyp; cin >> testfkttyp; GABin2DecGenome genome(map, testfkttyp == 1 ? Objective1 : Objective2);...
Gruß,
Simon2.
-
Simon2 schrieb:
Hat aber den Vorteil, dass
- genome auf verschiedene Objekte unterschiedlichen Typs (abgeleitet von GABin2DecGenome) zeigen kann,
- GABin2DecGenome weder default-konstruierbar noch zuweisbar (operator=()) zu sein braucht und
- bei sehr großen Klassen spart man Zeit, wenn man gleich "richtig konstruiert" und nicht erst def-konstr. und dann zuweist.
das ist mal ein wort
sowas sucht man tagelang im internet wegen was brignen poitner und dann sprichts eienr zu nem anderen thema aus... n1
-
Hallo Leute,
ja ist eine Objektdefinition mit dem constructor: GABin2DecGenome(const GABinDecPhenotyp &, GAGenome::Evaluator objective) Leider funktioniert nur das:
GABin2DecGenome genome(map, testfkttyp == 1 ? Objective1 : Objective2);Die anderen Codes bringen Fehler...
Was bedeuten ? , : in dem Fall? Ersatz für die if-Schleife?Wie kann ich den Ausdruck ändern um 3 Auswahlmöglichkeiten zu haben?
Was genau hab ich bei mir falsch gemacht?
Viele Grüße
Guddy
-
Die Fehlermeldung kriegst du erst bei (scheinbarer) Benutzung der Variablen 'genome', stimmt's?
Da du jedoch zwei Variablen namens 'genome' in jeweils eigenen Blöcken (mit { ... } ) definiert hast, werden diese danach sofort wieder gelöscht und sind nicht mehr zugreifbar.
Du darfst nur genau 1 Variable definieren (entweder direkt oder als Zeiger bzw. Referenz) und darauf zugreifen (und diese muß sich natürlich im selben Gültigkeitsbereich (scope) befinden, wie der spätere Zugriff darauf).
Und "a? b : c" ist der sogenannte Bedingungsoperator (conditional operator), welcher als einziger drei-stellig ist.
Du kannst diesen dann auch verschachteln, z.B. a? (b? c : d) : e, d.h. a und b sind deine Bedingungen und c, d und e deine Ausdrücke.
P.S: Auch die Varianten mit dem Zeiger (GABin2DecGenome *genome = new GABin2DecGenome(...) ) funktionieren, nur mußt du dann natürlich beim Zugriff darauf diese dann dereferenzieren, also
(*genome).do(); //bzw. genome->do();Aber das sollte eigentlich in jedem Anfängerbuch bzw. -tutorial stehen...
-
Hi,
also erstmal ist es (politisch) inkorrekt, von einer
guddy schrieb:
...if-Schleife?...
zu reden. Es ist immerhinhin ein Sprachelement zur bedingten Verzweigung....

Das Konstrukt "? : " heißt "arithmetisches if" und funktioniert als
[i]<bedingung>[/i] ? [i]<statement bei "wahr">[/i] : [i]<statement bei "falsch">[/i]und wie beim if selbst, gibt's auch hier keine "3. Möglichkeit", sondern musst (falls Du >2 "Zweige" hast) entweder Schachteln
if(bedingung1) { if(bedingung2) { mache_1_und_2(); } else { mache_1_und_nicht_2(); } } else { mache_nicht_1(); }oder mit switch (bei simplen Typen mit konstanten "Wertmöglichkeiten")
switch(meineVariable) { case 0 : mache_var_0(); break; case 1 : mache_var_1(); break; case 2 : mache_var_2(); break; default: mache_var_unbekannter_wert(); }Übrigens: Wenn es Dir lediglich darum geht, demselben Parameter des Konstruktor verschiedene Werte zuzuweisen, würde ich auch genau das tun ...
ObjectiveTyp objective; switch(testfkttyp) { case 0 : objective = Objektiv0; break; case 1 : objective = Objektiv1; break; default: objective = Objektiv2; } GABin2DecGenome genome(map, objective);(falls ObjectiveTyp nicht def-Konstruierbar oder zuweisbar sein sollte, kannst Du das auch mit Referenz machen)
Gruß,
Simon2.
-
Hallo Leute,
ich hab noch eine Frage. Wie kann ich folgendes realiesieren.
genome (map, objective):
Wenn objective = objective1 dann tue das
Wenn nicht tue etwas anderesGrüße
Guddy
-
Äh? Mit
if( objective == Objective1) { } else { }vielleicht?
-
guddy schrieb:
Hallo Leute,
ich hab noch eine Frage. Wie kann ich folgendes realiesieren.
genome (map, objective):
Wenn objective = objective1 dann tue das
Wenn nicht tue etwas anderesGrüße
Guddy
Ich würde (nochmal) sagen: Laufzeit-polymorphie mit virtuellen Funktionen.
Alternativ noch statische Polymorphie mit Templates.Beide Konstrukte sind für "ähnlich bis auf ..."-Situationen gemacht.
Gruß,
Simon2.