Case umgeht die Initialisierung einer lokalen Variable



  • Hallo,

    wie der Thread name schon sagt liegt mein problem in einer case struktur.erst mal was zum "anfassen" 😉

    #include <iostream.h>
    #include <string.h>
    
    //using namespace std;
    
    class Ampel
    {
    private:
    	int rot;
    	int gelb;
    	int gruen;
    
    public:
    	Ampel();
    	Ampel(int oben);
    	Ampel(int oben, int mitte);
    	Ampel(int oben, int mitte, int unten);
    	void AmpelRot();
    	void AmpelGelb();
    	void AmpelGruen();
    };
    
    	  Ampel::Ampel()
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf NULL gestellt!";
    		  rot = 0;
    		  gelb = 0;
    		  gruen = 0;
    	  }
    	  Ampel::Ampel(int oben)
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf rot gestellt!";
    		  rot = oben;
    		  gelb = 0;
    		  gruen = 0;
    	  }
    	  Ampel::Ampel(int oben, int mitte)
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf rot und gelb gestellt!";
    		  rot = oben;
    		  gelb = mitte;
    		  gruen = 0;
    	  }
    	  Ampel::Ampel(int oben, int mitte, int unten)
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf rot,gelb und gruen gestellt!";
    		  rot = oben;
    		  gelb = mitte;
    		  gruen = unten;
    	  }
    	  void Ampel::AmpelRot(void)
    	  {
                    if(rot == 1)
                    {
    		        cout<<"Die Ampel wurde auf rot gestellt!";
                    }
                    else
                    {
                            cout<<"Die Ampel ist nicht auf rot gestellt";
                    }
    	  }
    	  void Ampel::AmpelGelb(void)
    	  {
                    if(gelb == 1)
                    {
    		        cout<<"Die Ampel wurde auf gelb gestellt!";
                    }
                    else
                    {
                            cout<<"Die Ampel ist nicht auf gelb gestellt";
                    }
    	  }
    	  void Ampel::AmpelGruen(void)
    	  {
                    if(gruen == 1)
                    {
    		        cout<<"Die Ampel wurde auf grün gestellt!";
                    }
                    else
                    {
                            cout<<"Die Ampel ist nicht auf grün gestellt";
                    }
    	  }
    
    int main()
    {
    	int Auswahl;
    	cout<<"Es wird eine Ampel initialisiert.Wie möchten sie die Initialisierung durchführen?";
    	cout<<"1 = Initialisierung ohne jegliche Werte";
    	cout<<"2 = Initialisierung mit rot";
    	cout<<"3 = Initialisierung mit rot und gelb";
    	cout<<"4 = Initialisierung mit rot,gelb und grün";
    	if (!(cin >> Auswahl))
    	{
    		cerr<< "Es wurde eine falsch Eingabe gemacht\n";
    		exit(1);
    	}
    	cout<<"Es wird nun eine Ampel initialisiert...";
    	switch (Auswahl)
    	{
    	case 1:
    		cout<<"Sie haben eine Ampel mit keinen Werten gewählt";
    		Ampel Ampel1;
                    cout<<"Nun werden die Zustände der Ampelphasen abgefragt:";
                    Ampel1.AmpelRot();
                    Ampel1.AmpelGelb();
                    Ampel1.AmpelGruen();
    		break;
    	case 2:
    		cout<<"Sie haben eine Ampel mit rot gewählt";
    		Ampel Ampel2(1);
                    cout<<"Nun werden die Zustände der Ampelphasen abgefragt:";
                    Ampel2.AmpelRot();
                    Ampel2.AmpelGelb();
                    Ampel2.AmpelGruen();
    		break;
    	case 3:
    		cout<<"Sie haben eine Ampel mit rot und gelb gewählt";
    		Ampel Ampel3(1, 1);
                    cout<<"Nun werden die Zustände der Ampelphasen abgefragt:";
                    Ampel3.AmpelRot();
                    Ampel3.AmpelGelb();
                    Ampel3.AmpelGruen();
    		break;
    	case 4:
    		cout<<"Sie haben eine Ampel mit rot,gelb und grün gewählt";
    		Ampel Ampel4(1, 1, 1);
                    cout<<"Nun werden die Zustände der Ampelphasen abgefragt:";
                    Ampel4.AmpelRot();
                    Ampel4.AmpelGelb();
                    Ampel4.AmpelGruen();
    		break;
    	}
    
    	return 0;
    }
    

    Also das Programm hat keinerlei sinn und ist nur ein bisschen zum üben aber wo liegt das problem.ist das problem das ich in einer case anweisung eine klasse initialisieren will oder was??also das kann doch nicht sein oder??



  • Wenn du lokale Variablen initialisieren willst musst du da Klammern drum machen ...

    switch (something)
    {
    case 1:
        foo();
        break;
    case 2:
        {
            unsigned short test = 0;
            ++test;
        } break;
    default:
        break;
    }
    


  • okay also das war mir bis jetzt auch neu aber man kann ja nie dazu lernen und es funktioniert auch 😃 danke



  • okay...das nächste problem ist gekommen..also dadurch das ich die Klasse Ampel lokal erstellt habe kann ich nicht mehr außerhalb der switch struktur zugreifen..wie bewerkstellige ich das denn??also so hatte ich es gemacht:

    #include <iostream.h>
    #include <string.h>
    
    //using namespace std;
    
    class Ampel
    {
    public:
    	int rot;
    	int gelb;
    	int gruen;
    
    public:
    	Ampel();
    	Ampel(int oben);
    	Ampel(int oben, int mitte);
    	Ampel(int oben, int mitte, int unten);
    	void AmpelRot();
    	void AmpelGelb();
    	void AmpelGruen();
    };
    
    	  Ampel::Ampel()
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf NULL gestellt!\n";
    		  rot = 0;
    		  gelb = 0;
    		  gruen = 0;
    	  }
    	  Ampel::Ampel(int oben)
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf rot gestellt!\n";
    		  rot = oben;
    		  gelb = 0;
    		  gruen = 0;
    	  }
    	  Ampel::Ampel(int oben, int mitte)
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf rot und gelb gestellt!\n";
    		  rot = oben;
    		  gelb = mitte;
    		  gruen = 0;
    	  }
    	  Ampel::Ampel(int oben, int mitte, int unten)
    	  {
    		  cout<<"Die Ampel wurde bei der Initialisierung auf rot,gelb und gruen gestellt!\n";
    		  rot = oben;
    		  gelb = mitte;
    		  gruen = unten;
    	  }
    	  void Ampel::AmpelRot(void)
    	  {
                    if(rot == 1)
                    {
    		        cout<<"Die Ampel wurde auf rot gestellt!\n";
                    }
                    else
                    {
                            cout<<"Die Ampel ist nicht auf rot gestellt\n";
                    }
    	  }
    	  void Ampel::AmpelGelb(void)
    	  {
                    if(gelb == 1)
                    {
    		        cout<<"Die Ampel wurde auf gelb gestellt!\n";
                    }
                    else
                    {
                            cout<<"Die Ampel ist nicht auf gelb gestellt\n";
                    }
    	  }
    	  void Ampel::AmpelGruen(void)
    	  {
                    if(gruen == 1)
                    {
    		        cout<<"Die Ampel wurde auf gruen gestellt!\n";
                    }
                    else
                    {
                            cout<<"Die Ampel ist nicht auf gruen gestellt\n";
                    }
    	  }
    
    int main()
    {
    	int Auswahl;
    	cout<<"Es wird eine Ampel initialisiert.Wie möchten sie die Initialisierung durchfuehren?\n";
    	cout<<"1 = Initialisierung ohne jegliche Werte\n";
    	cout<<"2 = Initialisierung mit rot\n";
    	cout<<"3 = Initialisierung mit rot und gelb\n";
    	cout<<"4 = Initialisierung mit rot,gelb und gruen\n";
            cout<<"Ihre Auswahl bitte: \n";
    	if (!(cin >> Auswahl))
    	{
    		cerr<< "Es wurde eine falsch Eingabe gemacht\n";
    		exit(1);
    	}
    	cout<<"Es wird nun eine Ampel initialisiert...\n";
    	switch (Auswahl)
    	{
    	case 1:
    		cout<<"Sie haben eine Ampel mit keinen Werten gewaehlt\n";
                    {
    		        Ampel Ampel1;
                            cout<<"Nun werden die Zustaende der Ampelphasen abgefragt:\n";
                            Ampel1.AmpelRot();
                            Ampel1.AmpelGelb();
                            Ampel1.AmpelGruen();
                    }
    		break;
    	case 2:
    		cout<<"Sie haben eine Ampel mit rot gewaehlt\n";
                    {
    		        Ampel Ampel1(1);
                            cout<<"Nun werden die Zustaende der Ampelphasen abgefragt:\n";
                            Ampel1.AmpelRot();
                            Ampel1.AmpelGelb();
                            Ampel1.AmpelGruen();
                    }
    		break;
    	case 3:
    		cout<<"Sie haben eine Ampel mit rot und gelb gewaehlt\n";
                    {
    		        Ampel Ampel1(1, 1);
                            cout<<"Nun werden die Zustaende der Ampelphasen abgefragt:\n";
                            Ampel1.AmpelRot();
                            Ampel1.AmpelGelb();
                            Ampel1.AmpelGruen();
                    }
    		break;
    	case 4:
    		cout<<"Sie haben eine Ampel mit rot,gelb und gruen gewaehlt\n";
                    {
    		        Ampel Ampel1(1, 1, 1);
                            cout<<"Nun werden die Zustaende der Ampelphasen abgefragt:\n";
                            Ampel1.AmpelRot();
                            Ampel1.AmpelGelb();
                            Ampel1.AmpelGruen();
                    }
    		break;
    	}
    
            int Auswahl2;
            cout<<"Sie haben nun die Ampel ueber einen überladenen Konstruktor initialisiert.\n";
            cout<<"Nun koennen die die einzelnen Ampelfarben manuell veraendern\n";
            cout<<"1 = Ampel1 rot\n";
            cout<<"2 = Ampel1 gelb\n";
            cout<<"3 = Ampel1 gruen\n";
     	if (!(cin >> Auswahl2))
    	{
    		cerr<< "Es wurde eine falsch Eingabe gemacht\n";
    		exit(1);
    	}
            switch (Auswahl2)
            {
            case 1:
                    Ampel1.rot = 1;
                    break;
            case 2:
                    Ampel1.gelb = 1;
                    break;
            case 3:
                    Ampel1.gruen = 1;
                    break;
            }
    
            Ampel1.AmpelRot();
            Ampel1.AmpelGelb();
            Ampel1.Gruen();
    
    	return 0;
    }
    


  • Pointer ...



  • och nee...keine pointer..das ist nicht gerad mein lieblingsthema:-( naja wenns sonst keien andere lösung gibt dann muss es wohl so sein:-( aber danke nochmals



  • Wieso definierst du die klasse nicht vor der switch, dann kannst du sie doch überall ansprechen? Versteh echt dein Prob nicht?
    Und wenn du sie nicht in der gesamten main haben willst mach ne extra funktion draus oder so!

    int main()
    {
        int Auswahl;
        Ampel Ampel1;
    ...
    

    MfG schirrmie



  • jo das habe ich auch schon so umgesetzt:-) aber danke nochmal:-)



  • Hmm du solltest deine Ampel-Klasse wohl eher so aufbauen, das die Ampel nur EINEN Zustand annehmen kann. Also bsw so:

    // Ampel.h
    #if !defined(AMPEL_H__INCLUDED)
    #define AMPEL_H__INCLUDED
    
    #pragma once
    
    #include <iostream>
    
    class Ampel
    {
    public:
    	enum State{
    		AS_RED = 1,
    		AS_YELLOW,
    		AS_GREEN
    	};
    
    public:
        Ampel(void);
        Ampel(const State);
    
    public:
    	bool	is_red(void) const;
    	bool	is_yellow(void) const;
    	bool	is_green(void) const;
    
    public:
    	State	get_state(void) const;
    	void	set_state(const State);
    
    private:
    	State	m_curState;
    }; 
    
    #endif // AMPEL_H__INCLUDED
    
    // Ampel.cpp
    #include "Ampel.h"
    
    Ampel::Ampel(void) : m_curState(AS_RED)
    {
    	std::cout << "Der Ampel wurde bei der Initialisierung kein Zustand zugewiesen, d.h. steht sie auf Rot!" << std::endl;
    }
    
    Ampel::Ampel(const State state) : m_curState(state)
    {
    	std::cout << "Die Ampel wurde mit " << (m_curState == AS_RED ? "Rot" : (m_curState == AS_YELLOW ? "Gelb" : "Gruen")) << " initialisiert!" << std::endl;
    }
    
    bool Ampel::is_red(void) const
    {
    	return (m_curState == AS_RED);
    }
    
    bool Ampel::is_yellow(void) const
    {
    	return (m_curState == AS_YELLOW);
    }
    
    bool Ampel::is_green(void) const
    {
    	return (m_curState == AS_GREEN);
    }
    
    Ampel::State Ampel::get_state(void) const
    {
    	return m_curState;
    }
    
    void Ampel::set_state(const State state)
    {
    	m_curState = state;
    }
    
    // main.cpp
    
    #include <iostream>
    #include <string>
    #include <sstream>
    #include "ampel.h"
    
    int main(void)
    {
    	std::cout << "Willkommen bei ihrer Ampel!" << std::endl;
    	std::cout << "Wie soll ihre Ampel leuchten?" << std::endl;
    	std::cout << "\t(1)\tRot" << std::endl;
    	std::cout << "\t(2)\tGelb" << std::endl;
    	std::cout << "\t(3)\tGruen" << std::endl;
    
    	unsigned short selection = 1;
    	std::string input;
    
    	do {
    		std::cout << "Auswahl: " << std::flush;
    		std::getline(std::cin, input);
    
    		ss.clear();
    		ss.str(sInput);
    		ss >> selection;
    	} while (!ss || (selection > 3 || selection < 1));
    
    	Ampel ampel((selection == 3 ? AS_GREEN : (selection == 2 ? AS_YELLOW : AS_RED)));
    	// usw ...
    
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();	
    
    	return 0;
    }
    

    So ist es etwas besser gelöst ...


Log in to reply