[c++] Funktionsaufruf in if-anweisung



  • Hallo,

    ich hab folgenden Code:

    int testfkttyp;
    cin >> testfkttyp;
    
    if (testfkttyp == 1){
    GABin2DecGenome genome(map,Objective1);}
    else{
    GABin2DecGenome genome(map,Objective2);}
    

    Objective liefert jeweils einen mathematische Funktion zurück.
    Ich bekomme den Fehler:

    `genome' undeclared (first use this function)
    

    Was mach ich hier denn falsch?

    Grüße

    guddy



  • kann es sein das du vergessen hast die Headerdatei einzubinden in der
    GABin2DecGenom

    deklariert ist?



  • Was soll denn GABin2DecGenome überhaupt sein? Der Rückgabetyp? Wenn dann solltest du auch was zuweisen.



  • Braunstein, so wie es ausschaut, könnte das auch eine Klasse sein die er dort "aufruft" 🙂



  • 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 anderes

    Grüß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 anderes

    Grüß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.


Anmelden zum Antworten