problem mit klassen



  • also,
    habe folgende situation
    bei einem bestimmten ereigniss wird eine instanz einer klasse erzeugt.

    und ich möchte ja auf die methoden zugreifen, jedoch wenn ich dies versuche, bekomm ich den fehler das es diese instanz nicht gibt. logisch, wird ja erst bei nem ereigniss erstellt. aber schreiben das ich auf die methoden zugreif muss ich ja trotzdem vorher schon.

    wie lös ich dieses problem ?! 😕



  • Lass mal etwas Code sehen. Was verstehst du unter Ereignis?

    Im Notfall wären ja eventuell Zeiger eine Hilfe:

    class Hugo
    {
        public:
        void run () { cout << "Ich laufe!" << endl; }
    };
    
    ...
    
    Hugo* hugo = 0;
    
    switch(event)
    {
        case CREATE:
            hugo = new Hugo();
        break;
    
        case RUN:
            if(hugo)
                hugo->run();
            else
                cout << "There is no spoon..." << endl;
        break;
    }
    

    Ich verschieb dich mal ins Standard-C++-Forum, konsolenspezifisch erkenne ich hier nichts *g*

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • also, ereigniss ist ein tastendruck

    hier:

    if(eingabe == 32)
             {
                      cschuss shot(x_pos_spieler,y_pos_spieler);
                      schuss++;                
             }
    

    die klase ansich:

    class cschuss
    {
    public:
    
        int x_pos_schuss1 , y_pos_schuss , x_pos_schuss2;
    
        cschuss(int x, int y)
        {
            y_pos_schuss  = y-1;
            x_pos_schuss1 = x+2;
            x_pos_schuss2 = x+9;
        }
    
        void schuss_logik()
        {
    
             if(GetTickCount()>zeit)
             {
                 y_pos_schuss--;
                 zeit=GetTickCount()+20;
             }
        } 
    
        void schuss_grafik()
        {
            textcolor(YELLOW);
            gotoxy(x_pos_schuss1,y_pos_schuss);
            cout<<"*";
            gotoxy(x_pos_schuss1,y_pos_schuss+1);
            cout<<" ";
    
            gotoxy(x_pos_schuss2,y_pos_schuss);
            cout<<"*";
            gotoxy(x_pos_schuss2,y_pos_schuss+1);
            cout<<" ";
    
            if(y_pos_schuss<2)
            {
                gotoxy(x_pos_schuss1,y_pos_schuss);
                cout<<" ";
                gotoxy(x_pos_schuss2,y_pos_schuss);
                cout<<" ";
            } 
    
            gotoxy(x_pos_schuss1,y_pos_schuss+2); cout<<" ";
            gotoxy(x_pos_schuss2,y_pos_schuss+2); cout<<" "; 
    
        }                  
    
    };
    

    hier teil der main:

    while(!spiel_schleife)
        {
            delay(30);
            steuerung();
            shot.schuss_logik();
            grafik();
        }
    

    in steuerung() ist das eregniss drinne, mit welchem die instanz erstellt wird
    un danach möcht ich auf die methode zugreifen



  • danke schonma SideWinder

    jetzt is nur noch ein fehler 😃

    hab jetzt:

    cschuss* shot = 0;
    

    das is in die main gepackt

    shot->schuss_logik();
            shot->schuss_grafik();
    

    un das zum ausführen in der spielschleife

    shot = new cschuss(x_pos_spieler,y_pos_spieler);
    

    das beim ererigniss zum erstellen der instanz

    un hier beim letzten ist noch der fehler, und zwar:
    `shot' undeclared (first use this function)



  • Naja wo tritt den der Fehler auf, poste mal die Zeile oder sag welche der beiden es ist.

    Kurz gesagt: shot existiert in der Funktion nicht in der du sie benützen willst. Sicher, dass dort cschuss* shot = 0; *vor* shot->do_something() steht?

    MfG SideWinder



  • hab doch geschrieben, der fehler kommt bei dem letzten der zeilen

    bei

    shot = new cschuss(x_pos_spieler,y_pos_spieler);
    

    ja und reihenfolge stimmt

    main()
    cschuss* shot = 0;

    spielschleife
    shot->do();



  • Ja und liegt shot = blubb auch *nach* der Deklaration??

    MfG SideWinder



  • ja, die reihenfolge ist

    cschuss* shot = 0;

    dann
    in der steuerung, falls das event eintritt
    shot = new cschuss(x_pos_spieler,y_pos_spieler);

    un dann
    die logik un grafik methoden der klasse



  • Dann lass den kompletten Code sehen, hier hats was 😞

    MfG SideWinder



  • ok, also alles wird unüberischtlich hier 😃 aber die relevanten teile :

    also erstmal die klasse

    class cschuss
    {
    public:
    
        int x_pos_schuss1 , y_pos_schuss , x_pos_schuss2;
    
        cschuss(int x, int y)
        {
            y_pos_schuss  = y-1;
            x_pos_schuss1 = x+2;
            x_pos_schuss2 = x+9;
        }
    
        void schuss_logik()
        {
    
             if(GetTickCount()>zeit)
             {
                 y_pos_schuss--;
                 zeit=GetTickCount()+20;
             }
        } 
    
        void schuss_grafik()
        {
            textcolor(YELLOW);
            gotoxy(x_pos_schuss1,y_pos_schuss);
            cout<<"*";
            gotoxy(x_pos_schuss1,y_pos_schuss+1);
            cout<<" ";
    
            gotoxy(x_pos_schuss2,y_pos_schuss);
            cout<<"*";
            gotoxy(x_pos_schuss2,y_pos_schuss+1);
            cout<<" ";
    
            if(y_pos_schuss<2)
            {
                gotoxy(x_pos_schuss1,y_pos_schuss);
                cout<<" ";
                gotoxy(x_pos_schuss2,y_pos_schuss);
                cout<<" ";
            } 
    
            gotoxy(x_pos_schuss1,y_pos_schuss+2); cout<<" ";
            gotoxy(x_pos_schuss2,y_pos_schuss+2); cout<<" "; 
    
        }                  
    
    };
    

    dann die spielschleife:

    cschuss* shot = 0;
    
    while(!spiel_schleife)
        {
            delay(30);
            steuerung();
            if(shot)
                    shot->schuss_logik();
    
            grafik();
        }
    

    und dann hier noch die zwei funktionen steuerung() und grafik()

    void steuerung()
    {
        if (kbhit())
        {
             eingabe = getch();
    
             if(eingabe == 75)
                 richtung = 1;
             if(eingabe == 77)
                 richtung = 2;
             if(eingabe == 80)
                 richtung = 0;
             if(eingabe == 32)
             {
                      shot = new cschuss(x_pos_spieler,y_pos_spieler);
                      schuss++;                
             }
             if(eingabe == 27)
                      spiel_schleife = true;
    
             if(eingabe == 'l')
                      --life;
        } 
    
        if(richtung == 1 && x_pos_spieler > 2)
        {
            x_old_pos_spieler = x_pos_spieler;
            x_pos_spieler--;        
         }    
        if(richtung == 2 && x_pos_spieler < 72)
        {
            x_old_pos_spieler = x_pos_spieler; 
            x_pos_spieler++;           
        }
    
    }
    
    void grafik()
    {   
        gotoxy(3,46); textcolor(142); cout<<"Life";
    
        gotoxy(8,46); textcolor(8); 
        for (int i=0;i<20;++i)
            cout<<balken;
    
        textcolor(LIGHTRED);
        for(int i=0;i<life;++i)
        {
            gotoxy(8+i,46);    
            cout<<balken;
        }
    
        if(shot)
        shot->schuss_grafik();
    
        textcolor(7);
        gotoxy(x_old_pos_spieler,y_pos_spieler);   cout<<"        ";
        gotoxy(x_old_pos_spieler,y_pos_spieler+1); cout<<"        ";                                                       
        gotoxy(x_pos_spieler,y_pos_spieler);   cout<<"|  /\\  |";
        gotoxy(x_pos_spieler,y_pos_spieler+1); cout<<"||=||=||";
    }
    


  • Also shot = new blub; kann ja nciht funktionieren. Das rufst du ja in einer ganz anderen Funktion auf wo shot nicht bekannt ist. Also da müsstest du Parameter übergeben:

    cschuss* shot = 0;
    
    while(!spiel_schleife)
    {
        delay(30);
        steuerung(&shot); // shot als Parameter übergeben
        if(shot)
            shot->schuss_logik();    
        grafik();
    }
    
    void steuerung (cschuss*& shot) // geht sowas? probier das mal :D
    

    MfG SideWinder



  • DANKE !!
    funktionier 😃

    nur

    hab ich parameter geändert in

    steuerung(shot);
    

    also, nich als referenz , dann gings 😃

    jzet noch eine frage, es sollen ja mehrer schüsse gleichzeitig fliegen, deshalb ja übehraupt die klasse, sonst wärs ja auch ohne gegangen 🙂

    kann ich einfach shot mit nem index machen ?! also shot[index] ?!
    dann könnte man ganz leicht mehrere verwalten ...



  • 1. Ja klar ohne '&', dachte vorher noch an cschuss** und &shot, dann ist mir aber gekommen, dass Referenzen auf Zeiger auch möglich sein sollten und hab vergessen oben das '&' wieder rauszunehmen.

    2. Nicht so ganz. shot muss dann ein Array von cschuss sein. Viel einfacher als sich da jetzt aber um Speicher zu kümmern, ist es allerdings, ein bereits vorgefertigtes Array aus der STL zu benützen:

    #include <vector>
    using namespace std;
    
    ...
    
    vector<cschuss*> shots;
    
    ...
    
    // Statt shot = new blub;
    shots.push_back(new blub);
    
    // Statt if(shot)
    if(!shots.empty())
        ...
    
    // Statt shot->do_something();
    shot[i]->do_something();
    

    Wenn du alle Schüsse in steuerung() durchgehen willst kannst du dafür Iteratoren benützen:

    vector<cschuss*>::iterator iter = shots.begin();
    while(iter != shots.end())
    {
        (*iter)->do_something();
        ++iter;
    }
    

    Achja und den Kopf von steuerung musst du dann natürlcih auch anpassen, dementsprechend dann eine Referenz auf vector<cschuss*>

    MfG SideWinder



  • ok, vielen dank, werd mich jetzt ma dran setzen un das ausprobieren

    achja, eine sache noch:
    wie lösche ich shot wieder ?!

    nit delete shot; funktionierts irgendwie nich, also bekomm syntax fehler



  • Wo möchtest du denn shot löschen? Bereits den Vektor? Die einzelne Variable die du mit new angelegt hast? Also so wie du das bis jetzt hast sollte delete shot; funktionieren.

    MfG SideWinder



  • noch erstma nur mit dem einen shot

    habs so

    if(shot && shot.y_pos_schuss > 1)
            {
                    shot->schuss_logik();
                    shot->schuss_grafik();
            }
            else
                    delete shot;
    

    mit fehler
    request for member `y_pos_schuss' in `shot', which is of non-class type `cschuss*'



  • Da es sich um einen Zeiger handelt musst du zuerst sagen, dass du nicht den Zeiger haben willst, sondern das Objekt auf das er zeigt. Dann kannst du die Variable abrufen:

    (*shot).y_pos;
    

    Da es den faulen C++-Programmieren aber leid war immer soviel zu schreiben, noch dazu Sonderzeichen wurde dafür ein eigener Operator eingeführt:

    shot->y_pos;
    

    Achja und Variablen (also Attribute) von Klassen public zu machen ist gar nicht gut. Da verwendet man Getter&Setter-Methoden, also soetwas:

    class foo
    {
        int m_bar;
    
        public:
        int getBar ();
        void setBar (int bar);
    }
    
    int foo::getBar () { return m_bar; }
    void foo:setBar (int bar) { m_bar = bar; }
    

    Dann kannst du über diese Methoden auf deine Variable zugreifen, shot bleibt aber ein Zeiger, der richtige Operator ist also immer noch gefragt:

    if(shot && shot->getYPos() > 1)
     ...
    

    MfG SideWinder



  • vielen dank, nochma ^^

    ja, das mit public weiss ich ^^



  • ok, hab noch paar probleme mit den vectoren

    also;
    kopf der steuerung:

    void steuerung(vector<cSchuss*>)
    

    un übergabe:

    steuerung(&shots);
    

    un dann frage, zum berechnen & zeichnen aller schüsse , woltles es so machen, also der code befindet sich inner main inner spielschleife:

    if(!shots.empty())
            {
                    vector<cschuss*>::iterator iter = shots.begin();
                    while(iter != shots.end())
                    {
                        (*iter)->logik();
                        (*iter)->grafik();
                        ++iter;
                    }
            }
    


  • Und dein Problem lautet wie?

    Ich sag dir mal kurz was ich auf den ersten Blick sehe:

    1. Referenz auf den Vektor übergeben.
    2. Referenzen übergibt der Compiler automatisch, da muss kein & davor um die Adresse zu erhalten.

    MfG SideWinder


Anmelden zum Antworten