Objekt und Klassen- Func außerhalb definieren



  • Hi, Leute,
    ich habe mich jetzt an die Objekte ran gemacht.

    Folgendes:
    Mein Code wo ich die Funktionen in der Klasse definiert habe funktioniert wunderbar!
    Also,

    #include <iostream.h>
    #include <stdlib.h>
    #include <conio.h>
    
    class Klasse
    {
    	private:
    		int Variable;
    	public:
    		void setzeVariable(int was)
    		{
    			Variable = was;
    		};
    
    		void info(void)
    		{
    			cout << "Die Variable traegt im Moment den Wert " << Variable << endl;
    		}
    };
    
    Klasse Objekt;
    
    int neuerwert;
    
    void main(void)
    {
    	while(true)
    	{
    		system("cls");
    		cout << "Gib jetzt den Wert ein, den DEINE Variable in DEINEM Objekt tragen soll!"<<endl;
    		cout << "Beachte, dass es eine Zahl sein muss!"<<endl;
    		cout << "Gib \"0\" ein wenn das Programm beendet werden soll..."<<endl;
    		cin >> neuerwert;
    		Objekt.setzeVariable(neuerwert);
    		Objekt.info();
    		getch();
    		if( neuerwert == 0 )
    			break;
    	};
    	cout << "\n\n\nDas war das Testprogramm! Du bist fertig!"<<endl;
    	getch();
    };
    

    Mir ist zum Training nichts originelleres eingaefallen 😉

    So, jetzt wollte ich aber mal so zum Spaß info() ausßerhalb definieren...

    #include <iostream.h>
    #include <stdlib.h>
    #include <conio.h>
    
    class Klasse
    {
    	private:
    		int Variable;
    	public:
    		void setzeVariable(int was)
    		{
    			Variable = was;
    		};
    
    		void info(void);
    }
    
    void Klasse::info(void)
    {
    	cout << "Die Variable traegt im Moment den Wert " << Variable << endl;
    };
    
    Klasse Objekt;
    
    int neuerwert;
    
    void main(void)
    {
    	while(true)
    	{
    		system("cls");
    		cout << "Gib jetzt den Wert ein, den DEINE Variable in DEINEM Objekt tragen soll!"<<endl;
    		cout << "Beachte, dass es eine Zahl sein muss!"<<endl;
    		cout << "Gib \"0\" ein wenn das Programm beendet werden soll..."<<endl;
    		cin >> neuerwert;
    		Objekt.setzeVariable(neuerwert);
    		Objekt.info();
    		getch();
    		if( neuerwert == 0 )
    			break;
    	};
    	cout << "\n\n\nDas war das Testprogramm! Du bist fertig!"<<endl;
    	getch();
    };
    

    Jetzt erhalte ich aber eine Fehlermeldung 😞 ...

    --------------------Konfiguration: Objekte - Win32 Debug--------------------
    Kompilierung läuft...
    CRocket.cpp
    ...\CRocket.cpp(18) : error C2628: 'Klasse' gefolgt von 'void' unzulaessig (Semikolon ';' vergessen?)
    ...\CRocket.cpp(19) : error C2556: 'class Klasse __thiscall Klasse::info(void)' : Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'void __thiscall Klasse::info(void)'
    ...\CRocket.cpp(15) : Siehe Deklaration von 'info'
    ...\CRocket.cpp(19) : error C2371: 'info' : Neudefinition; unterschiedliche Basistypen
    ...\CRocket.cpp(15) : Siehe Deklaration von 'info'
    ...\CRocket.cpp(37) : error C2264: 'info' : Fehler in der Funktionsdefinition oder Funktionsdeklaration, Funktion nicht aufgerufen
    Fehler beim Ausführen von cl.exe.
    
    Objekte.exe - 4 Fehler, 0 Warnung(en)
    

    Wie muss ich das jetzt richtig machen...?

    thX
    robotangel

    P.S.
    Warukm ich die cpp CRocket genannt habe 😃 ?
    Keine Ahnung... 😃 😃



  • Wie der Compiler schon erraten hat, fehlt da ein Semikolon hinter der Klassendefinition.

    class Klasse
    {
    ...
    };



  • Öhm, mal ausprobieren obs klappt...

    Joa, klappt, THX!!

    Woher kommen dann eigentlich die anderen Fehlermeldungen, klar, ein paar kommen nur deshalb wel er info() nicht definiert hat, aber sonst ?!



  • Die meisten Fehler sind oft nur Folgefehler, entscheident ist immer der erste.



  • Jaja, das programmieren. Aus einem Fehler werden neun und wenn man(n) pech hat sind auch noch 4 Warungen dazwischen..

    Neues Problem:
    CRocket.h

    #include <iostream.h>
    #include <string>
    
    class Rocket
    {
    	private:
    		int Geschwindigkeit;
    		char planet[255];
    	public:
    		void GeschwindigkeitFestlegen(int NeueGeschwindigkeit);
    		void info(void);
    		void PlanetFestlegen(char Planet[255]);
    };
    

    func.cpp

    #include "CRocket.h"
    
    void Rocket::GeschwindigkeitFestlegen(int NeueGeschwindigkeit)
    {
    	Geschwindigkeit = NeueGeschwindigkeit;
    };
    
    void Rocket::info()
    {
    	cout << "Die Rackete bewegt sich mit einer Geschwindigkeit von " << Geschwindigkeit << " km/h auf den Planeten " << planet << " zu!"<<endl;
    };
    
    void Rocket::PlanetFestlegen(char Planet[255])
    {
    	strcpy( Planet, planet);
    };
    

    main.cpp

    #include "CRocket.h"
    
    Rocket Objekt;
    
    void main(void)
    {
    	Objekt.PlanetFestlegen("Venus");
    	Objekt.GeschwindigkeitFestlegen(40000);
    	Objekt.info();
    	Objekt.GeschwindigkeitFestlegen(70000);
    	Objekt.info();
    	Objekt.PlanetFestlegen("Telsia 5");
    	Objekt.GeschwindigkeitFestlegen(9);
    	Objekt.info();
    	Objekt.PlanetFestlegen("Mars");
    	Objekt.GeschwindigkeitFestlegen(1000000);
    	Objekt.info();
    };
    

    Na, die Profis können raten was jetz kommt...

    0Fehler 0Warungen

    Das Problem kommt erst bei start 😞

    "Die Anweisung in "<Speicheradresse>" verweist auf Spiecher in "<Speicheradresse>". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden"

    Na toll 😞

    PLEAZE HELP!!

    thX

    PS
    Womit sich das CRocket geklärt hätte;)



  • #include <string>
    

    das mud so sein

    #include <string.h>
    

    so compilierts dann jedenfalls beimir!!!

    P.S.: die Semikolons
    hinter der Mainfunktion und den ubrigen Funktionsdefinitionen bei Dir sin d Leere Anweisungen habsch mal gehört => EXE wird dadurch grösser
    so siehts besser aus

    void Rocket::GeschwindigkeitFestlegen(int NeueGeschwindigkeit) 
    { 
        Geschwindigkeit = NeueGeschwindigkeit; 
    }// Semikolon war hier zuviel 
    
    void Rocket::info(void) // !!! Parameter wie bei Klassendeklaration 
    //hatste vergessen es gibt Compiler die verzeihen sowas nisch 
    { 
        cout << "Die Rackete bewegt sich mit einer Geschwindigkeit von " << Geschwindigkeit << " km/h auf den Planeten " << planet << " zu!"<<endl; 
    } // Semikolon war hier zuviel
    
    void Rocket::PlanetFestlegen(char Planet[255]) 
    { 
        strcpy( Planet, planet); 
    }// Semikolon war hier zuviel
    
    void main(void) 
    { 
        Objekt.PlanetFestlegen("Venus"); 
        Objekt.GeschwindigkeitFestlegen(40000); 
        Objekt.info(); 
        Objekt.GeschwindigkeitFestlegen(70000); 
        Objekt.info(); 
        Objekt.PlanetFestlegen("Telsia 5"); 
        Objekt.GeschwindigkeitFestlegen(9); 
        Objekt.info(); 
        Objekt.PlanetFestlegen("Mars"); 
        Objekt.GeschwindigkeitFestlegen(1000000); 
        Objekt.info(); 
    } // Semikolon war hier zuviel
    

    Eine Klassendeklaration endet jedoch immer mit Semikolon!!!! Siehe dein
    erster Feheler von deinen Eingangsthema!!!

    mfg sclearscreen 🙂 👍



  • Also bei mir lief auch so wie's war alles. Nur: die Syntax bei strcpy war falschrum. Andersrum gingsdann //So wie von dir geschrieben 😉


Anmelden zum Antworten