Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.06.2010, 16:39

Basisklasse und Vererbung

Hallo Leute,

ich sitz grad an einem C++ Codeproblem und hoffe auf Hilfe.

Ich wollte ein kleines Schachspiel programmieren um mit Klassen, Vererbung und Objektorientierung besser umzugehen.

Dafür habe ich die Klasse "c_piece" erstellt, die für die Verwaltung der einzelnen Spielfiguren zuständig ist. Diese beinhaltet grundlegende Sachen wie Position, Farbe und einzelne set und get-Funktionen für diese Variablen.

Das ganze habe ich so definiert:

C-/C++-Quelltext

1
c_piece c_pieces[32];

Nun habe ich 7 abgeleitete Klassen dieser Basisklasse erstellt, nämlich für die einzelnen Figurentypen (Bauer, Turm, Pferd, Läufer, Dame, König)

Bisher habe ich diese der Basisklasse recht umständlich zugewiesen und ich bin mir ziemlich sicher, dass dies auch nicht richtig ist, denn wenn ich auf eine Funktion der abgeleiteten Klasse über die Basisklasse (z.B. c_pieces[1]) zugreifen möchte, kennt dieser nur die Funktion der Basisklasse, obwohl ich diese als virtual definiert habe!

Hier meine Zuweisung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
c_piece c_pieces[32];       // Erstelle 32 Figurenklassen für Zeiger
c_pawn c_pawns[16];              // und die abgeleiteten Klassen davon
c_rook c_rooks[4];
c_knight c_knights[4];
c_bishop c_bishops[4];
c_king c_kings[2];
c_queen c_queens[2];

// Weise der Basisklasse die abgeleiteten Klassen zu
for (unsigned int i = 0; i < 32; i++)
{       
      // Reihenfolge        
      // pawns, rooks, knights, bishops, kings, queens  
    
      if (i < 16)           
            c_pieces[i] = c_pawns[i];       
      else if (i < 20)          
            c_pieces[i] = c_rooks[i-16];        
      else if (i < 24)          
            c_pieces[i] = c_knights[i-20];      
      else if (i < 28)          
            c_pieces[i] = c_bishops[i-24];      
      else if (i < 30)          
            c_pieces[i] = c_kings[i-28];        
      else if (i < 32)          
            c_pieces[i] = c_queens[i-30];
}

Ich hoffe auf eure Unterstützung,

Gruß
Rusty1s

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Rusty1s« (01.06.2010, 16:54)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

01.06.2010, 17:09

du brauchst einen zeiger auf die basisklasse:

C-/C++-Quelltext

1
Basis *ptr = new abgeleitet();
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

01.06.2010, 17:34

Jo klar Zeiger, nur ich will ja meiner Basisklasse mehere abgeleitete Klassen zuweisen. also quasi so:

C-/C++-Quelltext

1
2
3
4
5
6
7
c_piece *p_pieces; // Erstelle 32 Figurenklassen als Zeiger
p_pieces = new c_pawn[16];
p_pieces[16] = new c_rook[4];
p_pieces[20] = new c_knight[4];
p_pieces[24] = new c_bishop[4];
p_pieces[28] = new c_king[2];
p_pieces[30] = new c_queen[2];

Nach den 16 Bauern müssten noch die anderen Figuren kommen, damit ich alle über p_pieces dann ansprechen kann. Leider funktioniert das nicht so wie oben angegeben.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

01.06.2010, 17:59

"new c_pawn[16];" erzeugt lediglich ein Array mit Platz für 16 Elemente (Zeiger?), aber nicht die 16 Elemente selber.

Man muss wirklich jedes Element separat erzeugen:

C-/C++-Quelltext

1
2
3
4
5
6
c_piece *p_pieces = new c_piece[32]; // Array mit Platz für 32 Elemente
for(int i=0; i<16; i++) {
    p_pieces[i] = new c_pawn();
}

for(i=16; i<....

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

5

01.06.2010, 18:32

Btw.

Besteht zwischen Brettstück und Figur nicht eher eine "hat-Beziehung" anstelle einer "ist-beziehung" ?

Ein König ist doch nicht Teil des Brettes. Er steht "nur" darauf.
WIP Website: kevinheese.de

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »KeksX« (01.06.2010, 18:37)


GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

6

01.06.2010, 18:44

Warum nicht einfach so:

C-/C++-Quelltext

1
2
3
4
c_piece* p_pieces[32];
    for(int i = 0; i < 16; ++i)
        p_pieces[i] = new c_pawn(5);
//...


Zitat

Btw.

Besteht zwischen Brettstück und Figur nicht eher eine "hat-Beziehung" anstelle einer "ist-beziehung" ?

Ein König ist doch nicht Teil des Brettes. Er steht "nur" darauf.

Es geht auch nicht um Brettstücker und Figuren sondern um Figuren und spezielle Figuren. "piece" heißt nämlich auch Schachfigur (http://dict.leo.org/?lp=ende&from=fx3&search=piece)

EDIT: (wollte eig. nur auf "Vorschau" klicken ...)

Das:

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
c_piece *p_pieces = new c_piece[32]; // Array mit Platz für 32 Elemente
for(int i=0; i<16; i++) {
    p_pieces[i] = new c_pawn();
}

for(i=16; i<....

geht nicht. Du erzeugst 32 objekte der Klasse c_piece und versuchst dann, diese Objekte mit Zeigern auf c_pawn Objekte zu überschreiben
=>

Zitat

d:\programmierung\tests\test_abc\test_abc\abc.cpp(14): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'c_pawn *' (or there is no acceptable conversion)
1> d:\programmierung\tests\test_abc\test_abc\abc.cpp(7): could be 'c_piece &c_piece::operator =(const c_piece &)'
1> while trying to match the argument list '(c_piece, c_pawn *)'
Signaturen werden überbewertet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GR-PA« (01.06.2010, 18:51)


7

01.06.2010, 18:54

Danke für eure Antworten!

Ich werde es jetzt erst mal mit dieser Methode versuchen:

C-/C++-Quelltext

1
2
3
c_piece* p_pieces[32];
    for(int i = 0; i < 16; ++i)
        p_pieces[i] = new c_pawn(5);


Tobiking: Deine Methode klappt leider nicht. new c_piece[32] reserviert nicht nur den Speicher, er füllt ihn auch sofort.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

01.06.2010, 19:04

das geht sowieso nicht in einer schleife weil er jede figur an ihre position setzen muss. sonst brauch er laufzeitidentifizierung die er sich so sparen kann.
die bauern kannst du aber in einer 2dschleife erstellen.
am einfachesten wäre ein 8x8 großes array mit einer variable die bestimmt was für eine figur drauf steht(dafür reicht ein einfaches integer). so musst du bei der auswahl/bewegung der figuren nicht immer die schleife durchlaufen und die richtige suchen sondern kannst direkt drauf zugreifen. ausserdem sparst du dir die vererbung(die du ja üben wolltest also vergiss es schnell wieder xD)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

9

01.06.2010, 19:09

Tobiking: Deine Methode klappt leider nicht. new c_piece[32] reserviert nicht nur den Speicher, er füllt ihn auch sofort.

Ja, ich hab das irgendwie mit Java durcheinander gebracht. Jetzt ist mir auch klar warum ich mir nicht erklären konnte ob das Array Zeiger enthält. :D

10

01.06.2010, 19:21

Zeiger in Java? ;)



Wäre mir neu.

Werbeanzeige