objekte einer Klasse erstellen, und verwenden
-
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 pointerich 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 pointerich 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 pointerich 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; //--------------------------------------------------------------------------- #endifkurze 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; //--------------------------------------------------------------------------- #endifWeiß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'
*
-
Pringles schrieb:
[C++ Fehler] Unit1.cpp(61): E2451 Undefiniertes Symbol 'spiel'Die Meldung bei den Code oben von mir?
Die Kommt wenn ich diese Syntax verwende:
(*spiel).schiffBewegen(spieler);anstatt dieser:
spiel->schiffBewegen(spieler);