Einteilung in Klassen



  • Servus ich habe versucht folgendes Programm mit der C Unterprogrammtechnik in C++ mit Klassen etc umzu setzten.
    Jetzt bin ich mir aber nicht sicher ob as in der main so in ordnung ist oder ob ich da doppelt arbeite weil ich da ja nochmal variable deklariere um das Programm zum laufen zu bekommen.

    #include <iostream.h>
    
    int cin_auswahl();
    void cout_wert(int);
    
    int cin_auswahl()
    {
        int auswahl;
        do 
    	{	
    	    cout<<"\n \t Z A H L E N K O N V E R T I E R U N G \n";                                                   
    	    cout<<"Bitte Waehlen Sie aus zwischen\n";                                        
    	    cout<<"1.Hexadezimal\n2.Octal\n3.Dezimal\n\n"; 
    	    cin >> auswahl; 	
    		if((auswahl<1)||(auswahl>3))
    		{
    		    cout<< "Wertenereich ungueltig";
    			cout<< "\nErneute Eingabe taetigen";
    		}
    	}while((auswahl<1)||(auswahl>3)); 
    	return(auswahl);
    }
    
    void cout_wert(int auswahl)
    {
        int	wert;
    	switch (auswahl) 
    	{					
            case 1: 
                   cout <<"\nHexadezimal  =";
                   cin >> hex >> wert;
    	       cout <<"Dezimal      ="<< dec <<wert;
                   cout <<"\nOctal        ="<< oct <<wert<<"\n"; 
    			   break;
    
    	    case 2: 
    	           cout <<"\nOctal       =";
    	           cin >> oct >>wert; 
                   cout<<"Dezimal     ="<< dec <<wert;
                   cout<<"\nHexadezimal ="<< hex << wert<<"\n"; 
                   break;
    
    	    case 3: 
    	           cout << "Dezimalzahl =";
    	           cin >> dec >> wert; 
                   cout<<"Hexadezimal ="<< hex << wert;
                   cout<<"\nOctal       ="<< oct <<wert<<"\n";  
                   break;   
    	} 		
    }
    int main()
    {
    
        int auswahl; 
        auswahl=cin_auswahl();
        cout_wert(auswahl);
    
    return 0;
    }
    

    mit klassen:

    #include <iostream.h>
    
    class nummber
    {
        public:
    		   void init(int wert,int auswahl);
               int cin_auswahl(int);
               void cout_wert(int,int);
    
    	private:
    		   int wert1;
    		   int auswahl1;
    };
    
    void nummber::init(int wert,int auswahl)
    {
    	wert1=wert;
    	auswahl1=auswahl;
    }
    
    int nummber::cin_auswahl(int auswahl)
    {
        do 
    	{	
    	    cout<<"\n \t Z A H L E N K O N V E R T I E R U N G \n";                                                   
    	    cout<<"Bitte Waehlen Sie aus zwischen\n";                                        
    	    cout<<"1.Hexadezimal\n2.Octal\n3.Dezimal\n\n"; 
    	    cin >> auswahl; 
    
    		if((auswahl<1)||(auswahl>3))
    		{
    		    cout<< "Wertenereich ungueltig";
    			cout<< "\nErneute Eingabe taetigen";
    		}
    
    	}while((auswahl<1)||(auswahl>3)); 
    
    	return(auswahl);
    }
    
    void nummber::cout_wert(int auswahl,int wert)
    {
    	switch (auswahl) 
    	{					
            case 1: 
                   cout <<"\nHexadezimal  =";
                   cin >> hex >> wert;
    			   cout <<"Dezimal      ="<< dec <<wert;
                   cout <<"\nOctal        ="<< oct <<wert<<"\n"; 
    			   break;
    
    	    case 2: 
    	           cout <<"\nOctal       =";
    	           cin >> oct >>wert; 
                   cout<<"Dezimal     ="<< dec <<wert;
                   cout<<"\nHexadezimal ="<< hex << wert<<"\n"; 
                   break;
    
    	    case 3: 
    	           cout << "Dezimalzahl =";
    	           cin >> dec >> wert; 
                   cout<<"Hexadezimal ="<< hex << wert;
                   cout<<"\nOctal       ="<< oct <<wert<<"\n";  
                   break;   
    	} 		
    }
    
    int main(void)
    {
    	int auswahl=0;
    	int wert=0;
        nummber zk;            //Zahlenkonvertierungsinstanz
    	zk.init(0,0);
    	auswahl=zk.cin_auswahl(auswahl);  
        zk.cout_wert(auswahl,wert);
    
    return 0;
    }
    

    schonmal danke für eure hilfe 🙂



  • #if !defined(NUMBER_H__INCLUDED) // - Include Guard
    #define NUMBER_H__INCLUDED // - Include Guard
    
    #if (_MSC_VER > 1000)
    	#pragma once // - Sowas ähnliches wie ein Include Guard ... Forumsuche
    #endif // _MSC_VER > 1000
    
    #include <iostream> // iostream.h gibt es im Standard nicht!
    
    class Number
    {
    private:
    	enum Type
    	{
    		N_DEC = 0,
    		N_OCT,
    		N_HEX
    	}	m_Type; // Unsere Zahlentypen ...
    	unsigned int	m_nValue; // Die Zahl ...
    
    public:
    	Number(const Type type = N_DEC, const unsigned int value = 0) : m_Type(type), m_nValue(value) // Konstruktor mit default-value und Initialisierungsliste
    	{}
    
    public:
    	void stream(std::ostream& stream) const // Funktion die einen Ausgabestream haben will ... dann können wir unsere Zahl in entsprechender Form ausgeben ... const, da wir nichts an den Membervariablen ändern ...
    	{
    		stream << (m_Type == N_DEC ? std::dec : (m_Type == N_OCT ? std::oct : std::hex)) << m_nValue;
    	}
    };
    
    #endif // NUMBER_H__INCLUDED // - Include Guard
    

    ... so wäre das eher zu machen ... also würde ich so machen 😉

    Edit
    So ... google.de einfach mal nach den Sachen wie "Include Guard" und benutz die Forumsuche für "Include Guard vs. #pragma once" ...
    Wenn de sonnst was nicht verstehst ... guck dir ein Grundlagen-Tutorial an!
    Jetzt musst du übrigens noch die operator's wie +, -, == usw überladen, damit deine Klasse einen Sinn hat.

    int main()
    {
        Number num(N_HEX, 100);
        num.stream(std::cout);
    }
    


  • oO so viele Sachen die ich noch nie gesehen hab^^

    könnte ich nicht einfach was an meiner main so ändern , das ich verhindere die beiden variablen nochmal neu zu deklarieren?

    kommt schlecht wenn ich da sachen einbaue die ich noch net gehabt hab und netmal im ansatz verstehe....



  • Hab dir was dran geschrieben ...



  • (D)Evil schrieb:

    public:
    	void stream(std::ostream& stream) const
    	{
    		stream << (m_Type == N_DEC ? std::dec : (m_Type == N_OCT ? std::oct : std::hex)) << m_nValue;
    	}
    };
    

    Igit. Wenn du aus nem case so ein unübersichtliches if ... else if .... else machst, ist es bestimmt nicht besser. Stell dir mal vor, dass soll erweitert werden.

    @Dragonslayer
    Ist dir der Sinn von Membervariablen bekannt? Wenn du auswahl1 einen Wert zuweist, dann hat sie diesen auch noch in der nächsten Methode, wenn es sich um die selbe instanz der Klasse handelt.



  • patternswärenzuviel
    Wollte ich die erweitern? Hab ich nicht gesagt. So ist es kürzer und ich versuchen meist eine rel. kurze Lösung zu finden ... gerade if else-kram kann man damit schön kürzen ...



  • geht ja nit darum das ich zu faul bin mir das anzueigen, nur ich soll halt als testat das obrige programm in Klassen unterteilen, quasi nur die grundlagen mit methoden etc.

    Das kann doch net so kompliziert sein^^

    will nur wissen obs sich die deklaration von zusätzlichen variablen die ich hier mache vermeiden läst.

    int main(void)
    {
        int auswahl=0;      // sinnvoll?
        int wert=0;         // sinnvoll?
        nummber zk;            //Zahlenkonvertierungsinstanz
        zk.init(0,0);
        auswahl=zk.cin_auswahl(auswahl);  
        zk.cout_wert(auswahl,wert);
    
    return 0;
    }
    


  • (D)Evil schrieb:

    So ist es kürzer und ich versuchen meist eine rel. kurze Lösung zu finden ...

    Was nicht immer besser ist, wenns nur um die Codelänge geht.

    @Dragonslayer
    So wie du das machst ist das nicht sinnvoll

    void nummber::cin_auswahl()
    {
        do
        {   
            cout<<"\n \t Z A H L E N K O N V E R T I E R U N G \n";                                                  
            cout<<"Bitte Waehlen Sie aus zwischen\n";                                        
            cout<<"1.Hexadezimal\n2.Octal\n3.Dezimal\n\n";
            cin >> auswahl1; //in die Membervariable
    
    ...
    void cout_wert()
    {
        int    wert;
        switch (auswahl1) //wieder die Membervariable verwenden
        {                   
            case 1:
      ...
    


  • hm die member varaible public machen?



  • ALso selber nochmal nachgedacht und zu dem entschluss gekommen das die beiden methoden ja einfach beide gar keine werte haben müssen

    #include <iostream.h>
    
    class nummber
    {
        public:
    		   void init(int wert,int auswahl);
               int cin_auswahl();
               void cout_wert();
    
    	private:
    		   int wert1;
    		   int auswahl1;
    };
    
    void nummber::init(int wert,int auswahl)
    {
    	wert1=wert;
    	auswahl1=auswahl;
    }
    
    int nummber::cin_auswahl()
    {
        do 
    	{	
    	    cout<<"\n \t Z A H L E N K O N V E R T I E R U N G \n";                                                   
    	    cout<<"Bitte Waehlen Sie aus zwischen\n";                                        
    	    cout<<"1.Hexadezimal\n2.Octal\n3.Dezimal\n\n"; 
    	    cin >> auswahl1; 
    
    		if((auswahl1<1)||(auswahl1>3))
    		{
    		    cout<< "Wertenereich ungueltig";
    			cout<< "\nErneute Eingabe taetigen";
    		}
    
    	}while((auswahl1<1)||(auswahl1>3)); 
    
    	return(auswahl1);
    }
    
    void nummber::cout_wert()
    {
    	switch (auswahl1) 
    	{					
            case 1: 
                   cout <<"\nHexadezimal  =";
                   cin >> hex >> wert1;
    			   cout <<"Dezimal      ="<< dec <<wert1;
                   cout <<"\nOctal        ="<< oct <<wert1<<"\n"; 
    			   break;
    
    	    case 2: 
    	           cout <<"\nOctal       =";
    	           cin >> oct >>wert1; 
                   cout<<"Dezimal     ="<< dec <<wert1;
                   cout<<"\nHexadezimal ="<< hex << wert1<<"\n"; 
                   break;
    
    	    case 3: 
    	           cout << "Dezimalzahl =";
    	           cin >> dec >> wert1; 
                   cout<<"Hexadezimal ="<< hex << wert1;
                   cout<<"\nOctal       ="<< oct <<wert1<<"\n";  
                   break;   
    	} 		
    }
    int main(void)
    {
        nummber zk;            //Zahlenkonvertierungsinstanz
    	zk.init(0,0);
    	zk.cin_auswahl();  
        zk.cout_wert();
    
    return 0;
    }
    

    versteh ich das richtig das man auf private elemente in methoden zugreifen kann, wenn man vorher mit einer init methode zuweist?



  • Hi,

    kleine Randbemerkung: "Nummber" ??
    Also ich würde mich für eine Sprache entscheiden. 😉

    Gruß,

    Simon2.


Anmelden zum Antworten