objekte einer Klasse erstellen, und verwenden
-
#include "Kl_Spielsteuerung.h"fehlt bei
SpielOberflaecheAH
-
#include "Kl_Spielsteuerung.h"fehlt bei
SpielOberflaecheAHDu kannst am besten alle include von SpielOberflaecheA.cpp in SpielOberflaecheA.h packen
-
Pringles schrieb:
#include "Kl_Spielsteuerung.h"fehlt bei
SpielOberflaecheAHDann sagt er mir:
*
[C++ Fehler] SpielOberflaecheA.cpp(20): E2279 Standardkonstruktor zur Initialisierung des Elements 'TForm1::spiel' nicht gefunden
*
-
//--------------------------------------------------------------------------- // "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), 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); } //---------------------------------------------------------------------------So?
-
Pringles schrieb:
So?
dann kommen für
SpielSteuerung spiel;(in der .h)
die Fehlermeldungen
*
[C++ Fehler] SpielOberflaecheA.h(36): E2303 Typname erwartet
[C++ Fehler] SpielOberflaecheA.h(36): E2139 In Deklaration fehlt ;
*
-
Kl_Spielsteuerung.h ist auch in der SpielOberflaecheA.h inkludiert?
-
Pringles schrieb:
Kl_Spielsteuerung.h ist auch in der SpielOberflaecheA.h inkludiert?
ja, das sind alle includes aus Spieloberflaeche.h
#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <Grids.hpp> #include "KL_Spielsteuerung.h" #include "Kl_DatenModellController.h"
-
Kannst du mal alles in ne zip oder rar packen und irgendwo hochladen. Würde das ganze um einiges einfacher machen.
-
klar...hier ist das ganze projekt (Turbo C++ 2006 von Borland)
ich hoffe, das klappt mit dem link...
-
Kann es leider nicht testen aber so solltes es gehen.
In der KL_SpielSteuerung.cpp: nur #include "KL_SpielSteuerung.h" includen.
Bei KL_SpielSteuerung.h alle includes durch diese ersetzen:#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <Grids.hpp> #include "Tserial_event.h" #include "KL_DatenModellController.h" #include <vcl.h> #include "conio.h"Bei SpielOberflaecheA.cpp:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)zu:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner), spiel(FeldA)und
spiel->memberfunktionenzu
spiel.memberfunktionenBei SpielOberflaecheA.h:
SpielSteuerung *spiel;zu:
SpielSteuerung spiel;
-
Pringles schrieb:
Kann es leider nicht testen aber so solltes es gehen.
Vielen Dank für deine Mühe, ich hoffe du saßt nicht die ganze Zeit nur daran

Ich hab die Änderungen mal kurz eingefügt und auf einmal kamen mehrere hundert Fehler, die vorher alle nicht waren. Als ich das ganze wieder raus gemacht hab, ist mir was eingefallen und wie sich herausgestellt hat, fehlte in der SpielOberflaeche.h einfach nur ein
class SpielSteuerung;über der Zeile
class TForm1 : public TForm { blabla }aber trotzdem vielen danke für deine Mithilfe!
-
Einmal ein paar grundsätzliche Punkte:
Turbo C++, ebenso wie der Borland C++ Builder sind leider keine guten Plattformen um C++ beizubringen, werden leider aber meist von Lehrern eingesetzt denen eine UI wichtig ist. Das Problem an der Sache sind im wesentlichen 3 Aspekte:
a) Selbst in der aktuellsten Version (C++ Builder XE 6) ist die Entwicklungsumgebung (zumindest für 32 Bit-Projekte) noch sehr weit von jeglicher Standardkonformität entfernt. Wobei dies für den Turbo C++ Compiler noch weit mehr gilt...
Das Problem hierbei ist auch, das man noch so viel darauf herumreiten kann, das Turbo C++ veraltet ist, von den aktuelle Versionen gibt es keine kostenlosen Versionen und ein Umstieg auf eine andere Plattform wird in diesem Fall nicht möglich sein, da die VCL verwendet wird...
b) Die VCL, die gerade von Lehrern gerne verwendet (und als C++ "verkauft") wird, basiert auf Delphi und hat einige Besonderheiten, die unter C++ zumindest unüblich zu nennen sind, unter anderem den Zwang new einzusetzen, wobei das delete in bestimmten Fällen [in der Regel wenn dem Konstruktor ein "Owner" übergibt], von den Komponenten selbst aufgerufen wird.
Dieser Zwang bei den VCL-Kompoenten wird dann gerne als allgemeiner Fall dargestellt, obwohl es eher ein schlechtes Beispiel für C++ darstellt. Zumal es gerade Anfängern schwer fällt, unterscheiden zu können ob nun ein new und ggf. auch ein delete notwendig sind. Als grober Anhaltspunkt: Wenn ein großes T vor dem Typ steht, handelt es sich üblicherweise um VCL-Komponenten die mit Ausnahme der trivialsten Datentypen (wie TDateTime...) mit new erzeugt werden müssen (und wenn kein übergeordnetes Element angegeben wird, auch später mit delete frei zugegeben sind).
c) Auch C++ Bücher helfen hier nicht viel, da man gegen eine Wand (einen Lehrer) anrennen muss, der meist ohnehin keine Lust an Informatik hat (Die meisten Informatiklehrer kommen nicht aus diesem Zweig und sind mehr oder weniger zwangsverpflichtet diesen Unterricht zu geben).
Und zu guter Letzt: Vielleicht wäre der Thread auch insgesamt besser im VCL-Unterforum aufgehoben, eben wegen dieser verschiedenen Punkte.
@Barnibas: Dir bleibt nur zu sagen das du das, was du aktuell lernst, nicht wirklich als C++ ansehen solltest. Wenn du C++ ernsthaft lernen willst, empfehle dir nach dem Abschluss der Schule das gelernte zu vergessen und mit einem guten C++ Buch zu beginnen.