[C/C++] Klassen Instanzierung in IF/ELSE-Konstrukt nicht außerhalb verwendbar.

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von gater001, 19. August 2010 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 19. August 2010
    Klassen Instanzierung in IF/ELSE-Konstrukt nicht außerhalb verwendbar.

    Hi RRler! Bin dabei C++ zu lernen und hab bei dem objektorientierten Teil ein kleines Problem mit den Klassen.
    Ok angenommen alles ist bereits fertig deklariert und eine einfache Instanzierung funktioniert wunderbar.
    Beispiel (Name der Klasse: cKonto):
    cKonto kto;

    Gut wunderbar...bis hier hin funktioniert halt alles, nur hab ich für einen bestimmten Fall den ich über eine IF abfrage abfange einen Überladeten Konstruktor...jo und da kommt der Fehler!
    Also Beispiel:
    Code:
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     cKonto kto(uber);
     }
     else
     {
     cKonto kto;
     }
    Da gibt mir eclipse einen Fehler aus -.-
    `kto' was not declared in this scope
    die kommt für beide Zeilen in denen ich Versuche das aufzurufen!
    An sich ist der Quellcode sauber und funktionstüchtig, das interessante ist ja auch das die Überladung hardcoded läuft, also wenn ich das if wegnehme und: cKonto kto(uber) benutze.

    Gut das wars dann, hoffe ihr könnt mir helfen!
     
  2. 19. August 2010
    AW: Klassen Instanzierung über IF

    ich denk das solltest du so lösen können:

    Code:
    cKonto *kto;
    
    if(ausdruck == true) {
     kto = new cKonto(argument);
    } else {
     kto = new cKonto();
    } 
    
    // mach was mit kto
    
    delete kto;
     
  3. 19. August 2010
    AW: Klassen Instanzierung über IF

    Ne klappt anscheinend auch nicht oder ich kriegs nicht hin ?(

    aber ich hab schonmal den Fehler an einer anderen Stelle...
    Also das mit den instanzieren der Klasse schluckt er anscheinend, aber jetzt meckert er weiter unten im Text in dem ich die Klasse benutzen möchte, da spuckt er mir die selbe Fehlermeldung aus:
    `kto' was not declared in this scope
    dumm das das alles zur kompilierzeit kommt, ich glaube nämlich das liegt halt daran das die Instanzierung über ein If läuft und eclipse merkt das und sagt ne es gibt noch keine instanz...
    Langsam gehen mir die ideen aus, ich post einfach mal den kompletten quellcode

    Code:
    /*
     * konto.cpp
     *
     * Created on: 18.08.2010
     * Author:
     */
    
    #include "konto.h"
    
    int main()
    {
    
     char chr_eingabe;
     int eingabe;
     double einzahlung=0;
     char warte;
     double uber;
    
    
     cout << "Sie haben die Möglichkeit bei der Eröffnung des Kontos"<<endl;
     cout << "direkt Geld zu überweisen."<<endl<<endl;
     cout << "Möchten sie dies tuhen? [J/N]\n";
     cin >> chr_eingabe;
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     system("cls");
     cout << "Geben sie den Betrag ein der einzuzahlen ist:\n";
     cin >> uber;
     system("cls");
     cKonto kto(uber);
     }
     else
     {
     cKonto kto;
     }
    
     scanf("%c", &warte);
     for(;1; )
     {
     system("cls");
     cout << "Operationen:\n";
     cout << "1 Kontostand ausgeben\n";
     cout << "2 Kontostand ändern\n";
     cout << "3 Konto auflösen...\n";
     cout << "Eingabe: ";
     scanf("%1d", &eingabe);
     fflush(stdin);
     system("cls");
    
     if(eingabe==1)
     {
     kto.ausgeben();
     scanf("%c", &warte);
     }
     else if(eingabe==2)
     {
     cout<< "Wieviel möchten sie einzahlen/abheben?\n";
     scanf("%lf", &einzahlung);
     kto.set_kontostand(einzahlung);
     scanf("%c", &warte);
     }
     else if(eingabe==3)
     {
     break;
     scanf("%c", &warte);
     }
     }
    
    
     return 0;
    }
    
    
    cKonto::cKonto()
    {
     kontostand=0;
     cout <<"Ihr Konto wurde eröffnet!\n";
    
    }
    cKonto::cKonto(double einzahlung)
    {
     kontostand=einzahlung;
     cout <<"Ihr Konto wurde mit einem Betrag von "<<kontostand<<" EUR eröffnet!\n";
    
    }
    
    cKonto::~cKonto()
    {
     char warte;
     cout <<"Konto wurde geschlossen!\n";
     scanf("%c", &warte);
    }
    
     
  4. 19. August 2010
    AW: Klassen Instanzierung über IF

    Es wäre noch interessant zu wissen, was in der "konto.h" drinsteht.

    Aber ein Fehler fällt sofort auf:
    Du achtest nicht auf die lokale Gültigkeit (auch "scope" genannt) von Variablen. Variablen, die auf dem Stack angelegt werden (d.h. keine Zeiger, sondern normale Variablen) sind nur in dem Block gültig, in dem sie deklariert werden:

    Code:
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     system("cls");
     cout << "Geben sie den Betrag ein der einzuzahlen ist:\n";
     cin >> uber;
     system("cls");
     cKonto kto(uber);
     }
     else
     {
     cKonto kto;
     }
    
    Hier deklarierst du die Variable "kto" in einem if- bzw. else-Block. Dass heißt, dass die Variable auch nur in diesem Block gültig ist. Sobald die "}"-Klammer kommt, wird das Objekt wieder zerstört. Der äußere Block (also die main()-Funktion) kennt die Variable "kto" deshalb gar nicht. Deshalb kriegst du später auch einen Fehler als du drauf zugreifen willst.

    Warum willst du das mit überladenen Konstruktoren machen? Es wäre viel einfacher, wenn du den Kontostand über eine zusätzliche Funktion setzt:
    Code:
     cKonto kto;
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     system("cls");
     cout << "Geben sie den Betrag ein der einzuzahlen ist:\n";
     cin >> uber;
     system("cls");
     kto.einzahlen(uber);
     }
    Damit wären die Probleme wohl gelöst.
     
  5. 19. August 2010
    AW: Klassen Instanzierung über IF

    1. Pack die Klassenimplementierung mal VOR die main Methode
    2. Die Fehlermeldung kommt daher, dass du kto innerhalb eines Blockes definierst und initialisierst und das Objekt nach dem Block nicht mehr verfügbar ist. Also wenn du eine Variable innerhalb von {} definierst, dann kann sie danach nicht mehr angesprochen werden.

    SyntaxErrors.info: The Leading Syntax Error Site on the Net
    Da steht mehr zu dem Fehler.

    Zu deinem Programm:
    Code:
    /*
    * konto.cpp
    *
    * Created on: 18.08.2010
    * Author:
    */
    
    #include "konto.h"
    
    cKonto::cKonto()
    {
     kontostand=0;
     cout <<"Ihr Konto wurde eröffnet!\n";
    
    }
    cKonto::cKonto(double einzahlung)
    {
     kontostand=einzahlung;
     cout <<"Ihr Konto wurde mit einem Betrag von "<<kontostand<<" EUR eröffnet!\n";
    
    }
    
    cKonto::~cKonto()
    {
     char warte;
     cout <<"Konto wurde geschlossen!\n";
     scanf("%c", &warte);
    }
    
    int main()
    {
    
     char chr_eingabe;
     int eingabe;
     double einzahlung=0;
     char warte;
     double uber;
     cKonto* kto = null; //Zeigervariable für das Konto Objekt
    
     cout << "Sie haben die Möglichkeit bei der Eröffnung des Kontos"<<endl;
     cout << "direkt Geld zu überweisen."<<endl<<endl;
     cout << "Möchten sie dies tuhen? [J/N]\n";
     cin >> chr_eingabe;
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     system("cls");
     cout << "Geben sie den Betrag ein der einzuzahlen ist:\n";
     cin >> uber;
     system("cls");
     kto = new cKonto(uber); //Zeiger auf Objekt setzen
     }
     else
     {
     kto = new cKonto();
     }
    
     scanf("%c", &warte);
     for(;1; )
     {
     system("cls");
     cout << "Operationen:\n";
     cout << "1 Kontostand ausgeben\n";
     cout << "2 Kontostand ändern\n";
     cout << "3 Konto auflösen...\n";
     cout << "Eingabe: ";
     scanf("%1d", &eingabe);
     fflush(stdin);
     system("cls");
    
     if(eingabe==1)
     {
     kto->ausgeben(); //-> anstatt . wegen zeigervariable
     scanf("%c", &warte);
     }
     else if(eingabe==2)
     {
     cout<< "Wieviel möchten sie einzahlen/abheben?\n";
     scanf("%lf", &einzahlung);
     kto->set_kontostand(einzahlung); //-> anstatt . wegen zeigervariable
     scanf("%c", &warte);
     }
     else if(eingabe==3)
     {
     break;
     scanf("%c", &warte); //dieser Codeteil wird nie erreicht...
     }
     }
    
     delete kto; //Speicher freigeben
     return 0;
    }
    Leider hab ich die konto.h nicht um es zu testen. Habe die gänderten Stellen kommentiert, damit du weißt was ich gemacht habe.

    greez
     
  6. 19. August 2010
    AW: Klassen Instanzierung in IF/ELSE-Konstrukt nicht außerhalb verwendbar.

    Ok um es erstmal zu vervollständigen hier die konto.h:
    Code:
    /*
     * konto.h
     *
     * Created on: 18.08.2010
     * Author:
     */
    #include <iostream>
    #ifndef KONTO_H_
    #define KONTO_H_
    using namespace std;
    
    
    
    class cKonto {
     private:
     double kontostand;
    
    
     public:
    
     //Methoden
     void ausgeben()
     {
     cout << "Ihr aktuelles Guthaben betraegt: "<<kontostand <<" EUR"<< endl;
     };
    
    
     //Getter/Setter
     void set_kontostand(double neu)
     {
     kontostand=kontostand + neu;
     };
     double get_kontostand()
     {
     return kontostand;
     };
    
     //konstruktor/Destruktor
     cKonto();
     cKonto(double einzahlung);
     ~cKonto();
    
    };
    
    
    
    #endif /* KONTO_H_ */
    
    Code:
    Pack die Klassenimplementierung mal VOR die main Methode
    das ging leider nicht...

    ich denk es liegt echt daran was pyro zuerst erwähnte, mir ist ja klar das das nur lokale Gültigkeit hat, nur dacht ich es wäre nur Funktionsübergreifend so und nicht nur in einer If einweisung - so kenn ich es aus der Strukturierten Programmierung in C und Assembler.

    Ok zum Lösungsvorschlag von cable...muss ich noch ausprobieren kam ich grad noch nicht zu, mach ich aber sofort. Nur einer Frage also ich will es definitiv über den Konstruktor und der Überladung machen, schon allein weil es in dem Kapitel wo ich bin darum geht
    wenn ich jetzt aber
    von cable verwende, wird da nicht schon direkt der Konstruktor durchgearbeitet oder in diesem fall nicht?
     
  7. 19. August 2010
    AW: Klassen Instanzierung in IF/ELSE-Konstrukt nicht außerhalb verwendbar.

    nein, da wird kein kontruktor aufgerufen, lediglich ein zeiger erstellt. erst bei "new cKonto(...)" wird das objekt instanziert.

    // btw: ich hoffe dir ist klar, dass dir in diesem thema alle moderatoren des forums geholfen haben und wir dir das einzeln in rechnung stellen werden
     
  8. 19. August 2010
    AW: Klassen Instanzierung in IF/ELSE-Konstrukt nicht außerhalb verwendbar.

    So, nun konnte ich es testen. So muss es ausschauen:

    Code:
    /*
    * konto.cpp
    *
    * Created on: 18.08.2010
    * Author:
    */
    
    #include "konto.h"
    
    cKonto::cKonto()
    {
     kontostand=0;
     cout <<"Ihr Konto wurde eröffnet!\n";
    
    }
    
    cKonto::cKonto(double einzahlung)
    {
     kontostand=einzahlung;
     cout <<"Ihr Konto wurde mit einem Betrag von "<<kontostand<<" EUR eröffnet!\n";
    
    }
    
    cKonto::~cKonto()
    {
     char warte;
     cout <<"Konto wurde geschlossen!\n";
     scanf("%c", &warte);
    }
    
    int main()
    {
    
     char chr_eingabe;
     int eingabe;
     double einzahlung=0;
     char warte;
     double uber;
     cKonto* kto = NULL; //Zeigervariable für das Konto Objekt
    
     cout << "Sie haben die Möglichkeit bei der Eröffnung des Kontos"<<endl;
     cout << "direkt Geld zu überweisen."<<endl<<endl;
     cout << "Möchten sie dies tuhen? [J/N]\n";
     cin >> chr_eingabe;
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     system("cls");
     cout << "Geben sie den Betrag ein der einzuzahlen ist:\n";
     cin >> uber;
     system("cls");
     kto = new cKonto(uber); //Zeiger auf Objekt setzen
     }
     else
     {
     kto = new cKonto();
     }
    
     scanf("%c", &warte);
     for(;1; )
     {
     system("cls");
     cout << "Operationen:\n";
     cout << "1 Kontostand ausgeben\n";
     cout << "2 Kontostand ändern\n";
     cout << "3 Konto auflösen...\n";
     cout << "Eingabe: ";
     scanf("%1d", &eingabe);
     fflush(stdin);
     system("cls");
    
     if(eingabe==1)
     {
     kto->ausgeben(); //-> anstatt . wegen zeigervariable
     scanf("%c", &warte);
     }
     else if(eingabe==2)
     {
     cout<< "Wieviel möchten sie einzahlen/abheben?\n";
     scanf("%lf", &einzahlung);
     kto->set_kontostand(einzahlung); //-> anstatt . wegen zeigervariable
     scanf("%c", &warte);
     }
     else if(eingabe==3)
     {
     break;
     scanf("%c", &warte); //dieser Codeteil wird nie erreicht...
     }
     }
    
     delete kto;
     return 0;
    }
    
    Falls du noch Fragen hast: einer der Moderatoren wird es sicher machen

    greez

    //zu deiner Frage: sorry, hatte null anstatt NULL geschrieben. Damit weißt man dem Zeiger nur die Adresse 0x0 zu, um zu zeigen, dass der Zeiger noch nicht belegt ist.
     
  9. 19. August 2010
    AW: Klassen Instanzierung in IF/ELSE-Konstrukt nicht außerhalb verwendbar.

    Das mit den Moderatoren ist mir sofort aufgefallen!
    Aber da du das jetzt schon angesprochen habt

    Ok cable's Lösungsvorschlag hat perfekt hingehauen! Jetzt hab ich nur noch einen kleinen schönheitsfehler bei der Anzeige

    haha ihr habt sogar die Topic geändert :lol:
    danke ihr habt mir voll geholfen ist besser als jedes buch :]

    Hier nochmal zur Vervollständigung das korrigierte falls jemand per Sufu drauf stoßt

    Code:
    /*
     * konto.cpp
     *
     * Created on: 18.08.2010
     * Author:
     */
    
    #include "konto.h"
    
    int main()
    {
    
     char chr_eingabe;
     int eingabe;
     double einzahlung=0;
     char warte;
     double uber;
     cKonto *kto;
    
     cout << "Sie haben die Möglichkeit bei der Eröffnung des Kontos"<<endl;
     cout << "direkt Geld zu überweisen."<<endl<<endl;
     cout << "Möchten sie dies tuhen? [J/N]\n";
     cin >> chr_eingabe;
     if(chr_eingabe=='j' || chr_eingabe=='J')
     {
     system("cls");
     cout << "Geben sie den Betrag ein der einzuzahlen ist:\n";
     cin >> uber;
     system("cls");
     kto = new cKonto(uber);
     scanf("%c", &warte);
     }
     else
     {
     kto = new cKonto;
     }
    
     scanf("%c", &warte);
     for(;1;)
     {
     system("cls");
     cout << "Operationen:\n";
     cout << "1 Kontostand ausgeben\n";
     cout << "2 Kontostand ändern\n";
     cout << "3 Konto auflösen...\n";
     cout << "Eingabe: ";
     scanf("%1d", &eingabe);
     fflush(stdin);
     system("cls");
    
     if(eingabe==1)
     {
     kto->ausgeben();
     scanf("%c", &warte);
     }
     else if(eingabe==2)
     {
     cout<< "Wieviel möchten sie einzahlen/abheben?\n";
     scanf("%lf", &einzahlung);
     kto->set_kontostand(einzahlung);
     scanf("%c", &warte);
     }
     else if(eingabe==3)
     {
     break;
     }
     }
    
     delete kto;
     return 0;
    }
    
    
    cKonto::cKonto()
    {
     kontostand=0;
     cout <<"Ihr Konto wurde eröffnet!\n";
    
    }
    cKonto::cKonto(double einzahlung)
    {
     kontostand=einzahlung;
     cout <<"Ihr Konto wurde mit einem Betrag von "<<kontostand<<" EUR eröffnet!\n";
    
    }
    
    cKonto::~cKonto()
    {
     char warte;
     cout <<"Konto wurde geschlossen!\n";
     scanf("%c", &warte);
    }
    
    Ok ich close dann mal, danke nochmal!!!
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.