objekte einer Klasse erstellen, und verwenden



  • jetzt bin ich total verwirrt! ich arbeite währenddessen weiter, und verwende ein weiteres objekt. das wird im constructor der klasse SpielSteuerung erzeugt:

    com = new Tserial_event();
    

    (die andere definition führt immer wieder zu Fehlermeldungen).

    In die Header-Datei hab ich es auch geschrieben, und zwar als private:

    Tserial_event *com;
    

    wenn ich jetzt versuche in einer methode der klasse SpielSteuerung darauf zu zu greifen, geht das hier:

    com->setManager(this);
    error = com->connect("COM6", 9600, SERIAL_PARITY_NONE, 8, false);
    

    aber hier nicht:

    size   = com->getDataInSize();
    

    [C++ Fehler] KL_SpielSteuerung.cpp(153): E2451 Undefiniertes Symbol 'com'
    *



  • Du brauchst keine Hilfe sondern ein gutes C++ Buch.

    Wie sollen wir dir helfen, ohne das du uns in deinen Code schauen lässt. Die definitionen in der Headerfile sagen uns nicht viel aus, oder meinst du nicht?

    Viel wichtiger ist die implementierung deiner Funktionen in der Cpp-Datei. Wenn dich nächstes mal jemand bittet deine Klasse zu zeigen, bette bitte Header- und Sourcefile.



  • //SpielSteuerung
    //---------------------------------------------------------------------------
    //                              controller = 0 -> Nichts
    //				controller = 1 -> Bewegen
    //				controller = 2 -> LCD aktualisieren
    //---------------------------------------------------------------------------
    #include "KL_SpielSteuerung.h"
    #include "KL_DatenModellController.h"
    
    DatenModellController *DatenA;
    
    SpielSteuerung::SpielSteuerung(TStringGrid *pFeldA){
    	FeldA = pFeldA;
    	controller = 0;
    	DatenA = new DatenModellController();
    
    	//Kommunikation
    	com = new Tserial_event();
    	if (com!=0)
    	{
    		com->setManager(this);
    		error = com->connect("COM6", 9600, SERIAL_PARITY_NONE, 8, false);
    
    	}
    }
    
    void SpielSteuerung::schiffBewegen(int spieler){
      // controller = 1; senden
      /*		while (T4 != true){
    				if (T1 == true){
    						schiffNachRechts(x, spieler);
    						}
    				if (T2 == true){
    						schiffNachUnten(y, spieler);
    						}
    				if (T3 == true){
    						schiffDrehen(spieler);
    						}
    				}
    			T4 = false;
                            controller = 0;     */
    }
    void SpielSteuerung::zeigeSpielfeld(int spieler){
    		int x, y;
    		x = 0;
            y = 0;
            if (spieler == 1){
                    while (x < 10){
    						while (y < 10){
                                    FeldA->Cells[x][y]= DatenA->leseFeld(x, y);
    								}
                            }
                    }
    }
    
    void SpielSteuerung::schiffNachRechts(int x, int spieler){
    		/*daten = 1;
    		welchesSchiff(schiff);
    		if ((x + 1 + breite) >= 10){
    				x = x + 1;
    				}
    		else{
    				x = 0;
    				}*/
    }
    
    void SpielSteuerung::schiffNachUnten(int y, int spieler){
    		/*daten = 2;
    		welchesSchiff(schiff);
    		if ((y + 1 + hoehe) >= 10){
    				y = y + 1;
    				}
    		else{
    				y = 0;
    				}*/
    }
    
    void SpielSteuerung::schiffDrehen(void){
    		drehen(breite, hoehe);
    }
    
    void SpielSteuerung::setzeDaten(int schiff){
    		if (spieler == 0){
    				xx = x;
    				yy = y;
    
    						while (xx = x + breite){
    						spielFeldA[xx][y] = "B";
    						xx = xx +1;
    								}
    
    						while (yy = y + hoehe){
    						spielFeldA[x][yy] = "B";
    						yy = yy + 1;
    						}
    						spielFeldAusgebenA();
    				}
    
    		else{
    				xx = x;
    				yy = y;
    
    						while (xx = x + breite){
    						spielFeldB[xx][y] = "B";
    						xx = xx +1;
    						}
    
    						while (yy = y + hoehe){
    						spielFeldB[x][yy] = "B";
    						yy = yy + 1;
    						}
    						spielFeldAusgebenB();
    				}
    }
    */
    void SpielSteuerung::setzeT4(){
    t4 = true;
    }
    
    void SpielSteuerung::OnDataArrival(int size, char *buffer){
    	if ((size>0) && (buffer!=0))
    	{
    	buffer[size] = 0;
    	//byte val = byte(buffer[0]);
    	}
    }
    
    void SpielSteuerung::SerialEventManager(uint32 event){
    	char *buffer;
    	int   size;
    		switch(event)
    		{
    			case  SERIAL_CONNECTED  :
    										printf("Connected ! \n");
    										break;
    			case  SERIAL_DISCONNECTED  :
    										printf("Disonnected ! \n");
    										break;
    			case  SERIAL_DATA_SENT  :
    										printf("Data sent ! \n");
    										break;
    			case  SERIAL_RING       :
    										printf("DRING ! \n");
    										break;
    			case  SERIAL_CD_ON      :
    										printf("Carrier Detected ! \n");
    										break;
    			case  SERIAL_CD_OFF     :
    										printf("No more carrier ! \n");
    										break;
    			case  SERIAL_DATA_ARRIVAL  :
    										size   = com->getDataInSize();
    										buffer = com->getDataInBuffer();
    										OnDataArrival(size, buffer);
    										com->dataHasBeenRead();
    										break;
    		}
    }
    

    das ist die .cpp



  • Ich würde dir ein gutes Grundbuch empfehlen:

    (1) du vermischst C und C++.
    (2) du weißt nicht was new macht, zumindest in C++ ;).
    (3) du nutzt keine Smartpointer.
    (4) du verwendest Zeiger, Stichwörter: call by reference, call by value, call by pointer



  • theconflict schrieb:

    Ich würde dir ein gutes Grundbuch empfehlen:

    Das Problem ist, ich sitz da schon ne weile dran und muss das am montag abgeben -.-

    theconflict schrieb:

    (1) du vermischst C und C++.
    (2) du weißt nicht was new macht, zumindest in C++ ;).
    (3) du nutzt keine Smartpointer.
    (4) du verwendest Zeiger, Stichwörter: call by reference, call by value, call by pointer

    ich mach alles genau so, wie ich es in der schule gelernt hab!



  • Barnibas schrieb:

    theconflict schrieb:

    (1) du vermischst C und C++.
    (2) du weißt nicht was new macht, zumindest in C++ ;).
    (3) du nutzt keine Smartpointer.
    (4) du verwendest Zeiger, Stichwörter: call by reference, call by value, call by pointer

    ich mach alles genau so, wie ich es in der schule gelernt hab!

    Ja, das ist scheinbar das Problem.



  • Nathan schrieb:

    Barnibas schrieb:

    theconflict schrieb:

    (1) du vermischst C und C++.
    (2) du weißt nicht was new macht, zumindest in C++ ;).
    (3) du nutzt keine Smartpointer.
    (4) du verwendest Zeiger, Stichwörter: call by reference, call by value, call by pointer

    ich mach alles genau so, wie ich es in der schule gelernt hab!

    Ja, das ist scheinbar das Problem.

    ich bin offen für alles, wenn ihr mir erklärt, wie ich es machen soll, mach ich es gerne so. ich sollte es halt nur verstehen, denn sonst kann ich das ganze schlecht präsentieren...



  • Barnibas schrieb:

    aber das löst nicht mein eigentliches Problem...hast du auch eine idee deswegen?

    Was ist denn dein Problem?
    Bekommst du immer noch den selbern Fehler wenn du das schreibst?

    SpielSteuerung spiel(FeldA);
    


  • Pringles schrieb:

    Was ist denn dein Problem?
    Bekommst du immer noch den selbern Fehler wenn du das schreibst?

    SpielSteuerung spiel(FeldA);
    

    ja tu ich!

    und inzwischen ist dazu gekommen, dass meine oberfläche verschwindet und ich keine ahnung hab, warum, da ich daran oder an der dazugehörigen .cpp/.h nichts verändert habe 😞



  • Kannst du auch mal den Code zeigen wo du

    SpielSteuerung spiel(FeldA);
    

    stehen hast. Bis jetzt hast du ja nur die SpielSteuerung.cpp und .h gezeigt.



  • Pringles schrieb:

    Kannst du auch mal den Code zeigen wo du

    SpielSteuerung spiel(FeldA);
    

    stehen hast. Bis jetzt hast du ja nur die SpielSteuerung.cpp und .h gezeigt.

    auf der ersten seite war schonmal ein teil davon, aber hier is mal der komplette code von SpielObberflaecheA.cpp (Die datei, zu meiner oberfläche).

    //---------------------------------------------------------------------------
    //					"X" = Treffer
    //					"O" = Daneben
    //					"=" = Schiffe
    //					" " = Wasser
    //					©Barnibas
    #include <vcl.h>
    #pragma hdrstop
    
    #include "SpielOberflaecheA.h"
    #include "KL_Spielsteuerung.h"
    #include "Kl_DatenModellController.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    SpielSteuerung spiel(FeldA);
    FeldA->Rows[1]->Add("A");                //Koordinaten beschriften
    FeldA->Rows[2]->Add("B");
    FeldA->Rows[3]->Add("C");
    FeldA->Rows[4]->Add("D");
    FeldA->Rows[5]->Add("E");
    FeldA->Rows[6]->Add("F");
    FeldA->Rows[7]->Add("G");
    FeldA->Rows[8]->Add("H");
    FeldA->Rows[9]->Add("I");
    FeldA->Rows[10]->Add("J");
    
    FeldA->Cols[1]->Add("1");
    FeldA->Cols[2]->Add("2");
    FeldA->Cols[3]->Add("3");
    FeldA->Cols[4]->Add("4");
    FeldA->Cols[5]->Add("5");
    FeldA->Cols[6]->Add("6");
    FeldA->Cols[7]->Add("7");
    FeldA->Cols[8]->Add("8");
    FeldA->Cols[9]->Add("9");
    FeldA->Cols[10]->Add("10");              //***
    FeldA->Cells[5][5]= "A";                 //Test
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::btnNeuesSpielClick(TObject *Sender)
    {
    int wx, wy;
    wx = 1;            		//Wasser X
    wy = 1;                 //Wasser Y
    
    for (wx = 1;wx < 11;wx++) {
    	for (wy = 1; wy < 11; wy++) {
    		FeldA->Cells[wx][wy]= " ";
    	}
    }
    spieler = 0;
    
    for (schiff = 10; schiff > 0;schiff-- ) {
    	spiel->schiffBewegen(spieler);
    }
    /*
    spieler = 1;
    
    for (schiff = 10; schiff > 0; schiff--) {
    	spiel->schiffBewegen(spieler);
    }*/
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::btnSetzenClick(TObject *Sender)
    {
    //spiel->setzeT4();	
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Label1->Caption = spieler;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::btnZeigeClick(TObject *Sender)
    {
    //spiel->zeigeSpielfeld(spieler);
    }
    //---------------------------------------------------------------------------
    


  • ok, ich habe (teilweise) eine Lösung gefunden. wenn ich den "->" in

    spiel->schiffBewegen(spieler);
    

    durch einen "." ersetze, funktioniert es in der ereignisroutine von btnNeuesSpiel, aber nicht bei den anderen Aufrufen (btnSetze und btnZeige). Bei beiden funktioniert weder ein "." noch ein "->".



  • SpielObberflaecheA.h wäre dann noch Interessant.



  • //---------------------------------------------------------------------------
    
    #ifndef SpielOberflaecheAH
    #define SpielOberflaecheAH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Grids.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	TLabel *Label1;
    	TButton *btnRechts;
    	TButton *btnRunter;
    	TButton *btnDS;
    	TStringGrid *FeldA;
    	TButton *btnNeuesSpiel;
    	TButton *btnSetzen;
    	TButton *btnZeige;
    	TTimer *Timer1;
    	void __fastcall btnNeuesSpielClick(TObject *Sender);
    	void __fastcall btnSetzenClick(TObject *Sender);
    	void __fastcall Timer1Timer(TObject *Sender);
    	void __fastcall btnZeigeClick(TObject *Sender);
    private:	// Benutzer-Deklarationen
    		int daten;
    		int schiff;
    		int spieler;
    		int controller;
    public:		// Benutzer-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    kurze frage am rand: welcher Befehl ist denn dafür zuständig, dass mein formulat (oberfläche TForm) erzeugt wird? oder gibts da gar keinen?



  • Wie ich vermutet habe: du definierst spiel im Konstruktor und versuchst, sie in den anderen Funktionen zu benutzen. Das geht nicht.

    Barnibas schrieb:

    ok, ich habe (teilweise) eine Lösung gefunden. wenn ich den "->" in

    spiel->schiffBewegen(spieler);
    

    durch einen "." ersetze, funktioniert es in der ereignisroutine von btnNeuesSpiel,

    Glaub ich nicht, jedenfalls nicht mit dem gezeigten Code.



  • manni66 schrieb:

    Wie ich vermutet habe: du definierst spiel im Konstruktor und versuchst, sie in den anderen Funktionen zu benutzen. Das geht nicht.

    wo muss ich spiel dann definieren?

    manni66 schrieb:

    Glaub ich nicht, jedenfalls nicht mit dem gezeigten Code.

    die Zeile

    spiel.schiffBewegen(spieler);
    

    liefert keine Fehlermeldung. ob sie wirklich funktioniert, weis ich nicht, weil ich keine oberfläche habe um es zu testen.



  • Geht das denn so?

    //--------------------------------------------------------------------------- 
    //                  "X" = Treffer 
    //                  "O" = Daneben 
    //                  "=" = Schiffe 
    //                  " " = Wasser 
    //                  ©Barnibas 
    #include <vcl.h> 
    #pragma hdrstop 
    
    #include "SpielOberflaecheA.h" 
    #include "KL_Spielsteuerung.h" 
    #include "Kl_DatenModellController.h" 
    //--------------------------------------------------------------------------- 
    #pragma package(smart_init) 
    #pragma resource "*.dfm" 
    TForm1 *Form1; 
    //--------------------------------------------------------------------------- 
    __fastcall TForm1::TForm1(TComponent* Owner) 
        : TForm(Owner)
    {
    FeldA->Rows[1]->Add("A");                //Koordinaten beschriften 
    FeldA->Rows[2]->Add("B"); 
    FeldA->Rows[3]->Add("C"); 
    FeldA->Rows[4]->Add("D"); 
    FeldA->Rows[5]->Add("E"); 
    FeldA->Rows[6]->Add("F"); 
    FeldA->Rows[7]->Add("G"); 
    FeldA->Rows[8]->Add("H"); 
    FeldA->Rows[9]->Add("I"); 
    FeldA->Rows[10]->Add("J"); 
    
    FeldA->Cols[1]->Add("1"); 
    FeldA->Cols[2]->Add("2"); 
    FeldA->Cols[3]->Add("3"); 
    FeldA->Cols[4]->Add("4"); 
    FeldA->Cols[5]->Add("5"); 
    FeldA->Cols[6]->Add("6"); 
    FeldA->Cols[7]->Add("7"); 
    FeldA->Cols[8]->Add("8"); 
    FeldA->Cols[9]->Add("9"); 
    FeldA->Cols[10]->Add("10");              //*** 
    FeldA->Cells[5][5]= "A";                 //Test
    spiel(FeldA);
    } 
    //--------------------------------------------------------------------------- 
    void __fastcall TForm1::btnNeuesSpielClick(TObject *Sender) 
    { 
    int wx, wy; 
    wx = 1;                 //Wasser X 
    wy = 1;                 //Wasser Y 
    
    for (wx = 1;wx < 11;wx++) { 
        for (wy = 1; wy < 11; wy++) { 
            FeldA->Cells[wx][wy]= " "; 
        } 
    } 
    spieler = 0; 
    
    for (schiff = 10; schiff > 0;schiff-- ) { 
        spiel.schiffBewegen(spieler); 
    } 
    /* 
    spieler = 1; 
    
    for (schiff = 10; schiff > 0; schiff--) { 
        spiel.schiffBewegen(spieler); 
    }*/ 
    } 
    //--------------------------------------------------------------------------- 
    
    void __fastcall TForm1::btnSetzenClick(TObject *Sender) 
    { 
    //spiel.setzeT4(); 
    } 
    //--------------------------------------------------------------------------- 
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender) 
    { 
    Label1->Caption = spieler; 
    } 
    //--------------------------------------------------------------------------- 
    
    void __fastcall TForm1::btnZeigeClick(TObject *Sender) 
    { 
    //spiel.zeigeSpielfeld(spieler); 
    } 
    //---------------------------------------------------------------------------
    
    //--------------------------------------------------------------------------- 
    
    #ifndef SpielOberflaecheAH 
    #define SpielOberflaecheAH 
    //--------------------------------------------------------------------------- 
    #include <Classes.hpp> 
    #include <Controls.hpp> 
    #include <StdCtrls.hpp> 
    #include <Forms.hpp> 
    #include <ExtCtrls.hpp> 
    #include <Grids.hpp> 
    //--------------------------------------------------------------------------- 
    class TForm1 : public TForm 
    { 
    __published:    // Von der IDE verwaltete Komponenten 
        TLabel *Label1; 
        TButton *btnRechts; 
        TButton *btnRunter; 
        TButton *btnDS; 
        TStringGrid *FeldA; 
        TButton *btnNeuesSpiel; 
        TButton *btnSetzen; 
        TButton *btnZeige; 
        TTimer *Timer1; 
        void __fastcall btnNeuesSpielClick(TObject *Sender); 
        void __fastcall btnSetzenClick(TObject *Sender); 
        void __fastcall Timer1Timer(TObject *Sender); 
        void __fastcall btnZeigeClick(TObject *Sender); 
    private:    // Benutzer-Deklarationen 
            int daten; 
            int schiff; 
            int spieler; 
            int controller;
    		SpielSteuerung spiel;
    public:     // Benutzer-Deklarationen 
        __fastcall TForm1(TComponent* Owner); 
    }; 
    //--------------------------------------------------------------------------- 
    extern PACKAGE TForm1 *Form1; 
    //--------------------------------------------------------------------------- 
    #endif
    

    Weißt du was das macht?

    spiel->schiffBewegen(spieler);
    

    Es ist eigentlich nichts anderes als:

    (*spiel).schiffBewegen(spieler);
    


  • Pringles schrieb:

    Weißt du was das macht?

    spiel->schiffBewegen(spieler);
    

    Es ist eigentlich nichts anderes als:

    (*spiel).schiffBewegen(spieler);
    

    habs versucht, kommt die exakt selbe Fehlermeldung!



  • [C++ Fehler] Unit1.cpp(61): E2451 Undefiniertes Symbol 'Spiel'
    

    Die Meldung bei den Code oben von mir?



  • Zu der Zeile:

    SpielSteuerung spiel;
    

    kommen diese Fehlermeldungen:
    *
    [C++ Fehler] SpielOberflaecheA.h(34): E2303 Typname erwartet
    [C++ Fehler] SpielOberflaecheA.h(34): E2139 In Deklaration fehlt ;
    *

    zu dieser Zeile:

    spiel(FeldA);
    

    diese Fehlermeldung:
    *
    [C++ Fehler] SpielOberflaecheA.cpp(44): E2268 Aufruf der undefinierten Funktion 'spiel'
    *

    und zu der Zeile:

    spiel.schiffBewegen(spieler);
    

    die Fehlermeldung:
    *
    [C++ Fehler] SpielOberflaecheA.cpp(61): E2451 Undefiniertes Symbol 'spiel'
    *


Anmelden zum Antworten