Konsolen prog :(



  • Hab mal wieder ein kleines problem:

    Hab jetzt mal angefangen ein wenig OOP verständnis zubekommen und hab mal ein programm angefangen was ein kleines testspiel darstellt.

    Hier mal der code:

    Pistole.h :

    #ifndef Pistole
    #define Pistole
    
    //Klasse der Waffe Pistole
    class Pistole
    {
    public:
    	void info(Pistole&);
    	void fire(Pistole&);
    	void reload(Pistole&);
    	void idle(Pistole&); //(eher unnütze)
    	void hit(Pistole&);
    	int damage;
    private:
    	int shoot;
    	int magazin;
    	int ammo;
    };
    
    #endif
    

    Player.h :

    #ifndef Player
    #define Player
    
    //Klasse des Spielers
    class Player
    {
    public:
    	void get_health(Player&);
    	void get_damage(Player&);
    	void make_damage(Player&);
    	void get_info(Player&);
    	int health;
    private:
    	int armor;
    };
    
    #endif
    

    Enemy.h :

    #ifndef Enemy
    #define Enemy
    
    //Klasse des Regners
    class Enemy
    {
    public:
    	void get_health(Enemy&);
    	void get_damage(Enemy&);
    	void make_damage(Enemy&);
    	void get_info(Enemy&);
    public:
    	int health;
    	int armor;
    };
    
    #endif
    

    Quellcode.cpp //Mir viel kein besserer ein 😛

    #include <iostream>
    using namespace std;
    
    #include "Pistole.h"
    #include "Player.h"
    #include "Enemy.h"
    
    //infos über die waffe sowie festlegung von leben und co.
    void Pistole::info(Pistole& refppk)
    {
    	cout<<"Waffen Infos:\n"
    		<<"***************************************************\n\n";
    	refppk.damage=20;
    	refppk.ammo=150;
    	cout<<"Pistolenname:Walther PPK\n"
    		<<"Magazingroesse:"<<refppk.magazin<<endl
    		<<"Gesamt Munition:"<<refppk.ammo<<endl
    		<<"Schaden:"<<refppk.damage<<endl;
    	Player::get_info(Player&);
    	Enemy::get_info(Enemy&);
    }
    
    //vllt unnütz!
    //waffe tut nichts.
    void Pistole::idle(Pistole& refppk)
    {
    	cout<<"Nichts passiert\n";
    }
    
    //Schiesst eine bestimmte anzahl kugeln ab und ruft be leeren magazin 
    //die nachlade funktion auf.
    
    void Pistole::fire(Pistole& refppk)
    {
    	cout<<"Wie oft wollen sie schiessen?\n"
    		<<"Geben sie die anzahl der schüsse ein\n";
    	cin>>refppk.shoot;
    
    	refppk.magazin-=refppk.shoot;
    
    	if(refppk.magazin<=0)
    	{
    		refppk.reload(refppk);
    	}
    	else();
    	{
    		cout<<"Sie haben noch "<<refppk.shoot<<" im Magazin\n";
    	}
    }
    
    //@WIP
    void Pistole::reload(Pistole& refppk)
    {
    	if(refppk.magazin<20||refppk.magazin<=0)
    	{
    		refppk.ammo-=refppk.magazin;
    	}
    	else(refppk.magazin>=20);
    	{
    		cout<<"Das Magazin ist noch voll\n";
    	}
    }
    
     //vllt unnütz!
    void Pistole::hit(Pistole& refppk)
    {
    	refppk.damage=20;
    }
    
    void Player::get_health(Player& refplay)
    {
    	refplay.health=100;
    }
    
    //Info über den spieler und initalisierungen der wichtigsten sachen ;)
    void Player::get_info(Player& refplay)
    {
    	refplay.armor=100;
    	refplay.health=100;
    	cout<<"Sie haben "<<refplay.health<<" Leben und"
    		<<refplay.armor<<" Armor";
    }
    
    //infos über die waffe sowie festlegung von leben und co.
    void Pistole::info(Pistole& refppk)
    {
    	cout<<"Waffen Infos:\n"
    		<<"***************************************************\n\n";
    	refppk.damage=20;
    	refppk.ammo=150;
    	cout<<"Pistolenname:Walther PPK\n"
    		<<"Magazingroesse:"<<refppk.magazin<<endl
    		<<"Gesamt Munition:"<<refppk.ammo<<endl
    		<<"Schaden:"<<refppk.damage<<endl;
    	Player::get_info(Player&);
    	Enemy::get_info(Enemy&);
    }
    
    //funktion int main() Hier startet das programm ;)
    int main()
    {
    	Pistole ppk;
    	Player play;
    	Enemy ene;
    	play.get_health(Player&);
    	for(;play.health>0;)
    	{
    	ppk.info(ppk);
    	cout<<"\nWaehlen sie nun was sie tun wohlen!\n";
    	char op;
    	cin>>op;
    
    	switch(op)
    	{
    	case 'f':
    	case 'F':
    		ppk.fire(ppk);
    		break;
    	case 'r':
    	case 'R':
    		ppk.reload(ppk);
    		break;
    	case 'i':
    	case 'I':
    		//ppk.idle(ppk);
    		break;
    	default:
    		cout<<"Nichts ist passiert\n";
    
    	}
    	play.get_health(Player&);
    	}
    	cout<<"Sie sind tod\n";
    	system("PAUSE");
    }
    

    Das Programm ist zwar nicht fertig aber ich bekomme beim compilieren immer diese fehler:

    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Pistole.h(8) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Pistole.h(9) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Pistole.h(10) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Pistole.h(11) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Pistole.h(12) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Pistole.h(18) : warning C4094: 'class' ohne Tag deklariert keine Symbole
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Player.h(8) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Player.h(9) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Player.h(10) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Player.h(11) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Player.h(15) : warning C4094: 'class' ohne Tag deklariert keine Symbole
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Enemy.h(8) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Enemy.h(9) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Enemy.h(10) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Enemy.h(11) : error C2059: Syntaxfehler: '&'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Enemy.h(15) : warning C4094: 'class' ohne Tag deklariert keine Symbole
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(12) : error C2039: 'info': Ist kein Element von 'operatorglobal namespace''' c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(12) : error C2065: 'refppk': nichtdeklarierter Bezeichner c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(13) : error C2448: 'info': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(28) : error C2039: 'idle': Ist kein Element von 'operatorglobal namespace'''
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(28) : error C3861: 'refppk': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(29) : error C2448: 'idle': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(37) : error C2039: 'fire': Ist kein Element von 'operatorglobal namespace''' c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(37) : error C3861: 'refppk': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(38) : error C2448: 'fire': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(56) : error C2039: 'reload': Ist kein Element von 'operatorglobal namespace'''
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(56) : error C3861: 'refppk': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(57) : error C2448: 'reload': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(69) : error C2039: 'hit': Ist kein Element von 'operatorglobal namespace''' c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(69) : error C3861: 'refppk': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(70) : error C2448: 'hit': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(75) : error C2039: 'get_health': Ist kein Element von 'operatorglobal namespace'''
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(75) : error C2065: 'refplay': nichtdeklarierter Bezeichner
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(76) : error C2448: 'get_health': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(82) : error C2039: 'get_info': Ist kein Element von 'operatorglobal namespace''' c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(82) : error C3861: 'refplay': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(83) : error C2448: 'get_info': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein c:\\Dokumente und Einstellungen\\Milbret\\Eigene Dateien\\Visual Studio Projects\\C++ Projekte\\test\\Quellcode.cpp(92) : error C2039: 'info': Ist kein Element von 'operatorglobal namespace'''
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(92) : error C3861: 'refppk': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(93) : error C2448: 'info': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(110) : error C2065: 'ppk': nichtdeklarierter Bezeichner
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(111) : error C2065: 'play': nichtdeklarierter Bezeichner
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(112) : error C2065: 'ene': nichtdeklarierter Bezeichner
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(113) : error C2228: Der linke Teil von '.get_health' muss eine Klasse/Struktur/Union sein
    Typ ist ''unknown-type''
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(113) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(114) : error C2228: Der linke Teil von '.health' muss eine Klasse/Struktur/Union sein
    Typ ist ''unknown-type''
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(114) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.



  • Erstmal sind die ganzen "Pistole&"- bzw. "Player&"-Parameter bei deinen Methoden überflüssig - jede (nichtstatische) Methode hat einen this-Zeiger, mit dem du auf das aufrufende Objekt zugreifen kannst, z.B:

    void Pistole::info()
    {
        cout<<"Waffen Infos:\n"
            <<"***************************************************\n\n";
        this->damage=20;//was machen Zuweisungen in einer Info-Methode?
        this->ammo=150;
        cout<<"Pistolenname:Walther PPK\n"
            <<"Magazingroesse:"<<this->magazin<<endl
            <<"Gesamt Munition:"<<this->ammo<<endl
            <<"Schaden:"<<this->damage<<endl;
    /* die beiden Anweisungen sind Unsinn - du benötigst konkrete Player- bzw. Enemy-Objekte, um deren get_info() nutzen zu können
        Player::get_info(Player&);
        Enemy::get_info(Enemy&);
    */
    }
    

    Als nächstes solltest du dir mal überdenken, was du machen willst 😉 Dort sind nach erstem Überfliegen noch einige logische Fehler drin.



  • hmm okay 🙂 werd das gleich mal ändern 😉

    Hmm was mir jetzt auffällt ist das die klassen elemente sowie die methoden nicht angezeigt werden wenn ich Pistole:: schreiben 😞 nur warum ?

    EDIT: Hab jetzt mal alles in eine Header geschrieben und diese included wie ich es zuvor hatte 🙂 und nun geht es zwar aber nur weil ich wieder das ganze & eingebaut habe aber es gibt immer noch probleme:

    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(18) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(19) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(45) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(94) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(120) : error C2059: Syntaxfehler: ')'



  • Du musst verhindern, dass sich die Includeguard-Symbole mit irgendwelchen Namen in deinem Code überschneiden.



  • Genauer gesagt:
    Mit #define Pistole definierst du ein Makro "Pistole" mit dem Inhalt "" (keiner). Der Präprozessor ersetzt also jedes "Pistole" durch Nichts, bevor er überhaupts compilieren anfängt...



  • Okay jetzt klappt es mit den seperaten header dateien aber ich hab noch diese fehler:

    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(21) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(49) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(100) : error C2059: Syntaxfehler: ')'
    c:\Dokumente und Einstellungen\Milbret\Eigene Dateien\Visual Studio Projects\C++ Projekte\test\Quellcode.cpp(126) : error C2059: Syntaxfehler: ')'



  • Player::get_info(Player&);
    

    Was ist das? 🙂

    Falls Du meinst "rufe get_info auf der aktuellen Instanz auf", das geht so:

    this->Player::get_info()
    

    oder kürzer

    get_info()
    

    da die aktuelle Instanz und der Klassenname bei Methodenaufrufen immer implizit ergänzt wird.

    Deine get_info (und andere Methoden) brauchen auch keinen Parameter dafür.



  • hmm okay und wie soll ich dann die werte im speicer der klasse ändern?
    über zeiger?



  • z.B. so:

    void Pistole::set_damage(int ndam)
    {
      this->damage=ndam;
    }
    
    //Hauptprogramm:
    Pistole PPK;
    PPK.set_damage(50);
    


  • Und selbst "this->" ist nicht nötig da die aktuelle Instanz und der Klassenname auch bei Memberaufrufen immer implizit ergänzt wird.



  • Das Ansprechen per this ist nur dann nötig, wenn ein Funktionsparameter den gleichen Namen hat, wie ein Member und man auf den Member der Klasse zugreifen möchte. Wäre sonst auch sehr lästig und imho häßlich, wenn man immer "this->" schreiben müsste.


Anmelden zum Antworten