Problem, Klasse(n) im Projekt bekannt zu machen

Hallo,

ich möchte eine Klasse in einer .ino-Datei bekannt machen.

Leider klappt das nicht (mehr).

Es geht in der asteroid.ino um die Klassendefnition PlayerClass (Dateien Player.h und Player.cpp).

Als Fehler erhalte ich die folgende Ausgabe.

asteroid.ino: 13:39: error: invalid use of incomplete type 'class PlayerClass
Error compiling project sources
Build failed for project 'asteroid'
PlayerClass *player = new PlayerClass()

asteroid.ino: 7:7: error: forward declaration of 'class PlayerClass
class PlayerClass

asteroid.ino: In function void loop()

zLogic.ino: 45:9: error: request for member 'Update' in 'player', which is of pointer type 'PlayerClass*' (maybe you meant to use '->' ?)
player.Update(passedMillis)

Recherchen lassen darauf schließen, dass beim Einbinden von Klassen eine Art Zirkelverweis entsteht. Sollte es tatsächlich daran liegen, finde ich die entscheidende Lösung nicht.

Ich habe versucht es mit #include "Player.h" und mit class PlayerClass; versucht.

Anbei ist das gesamte Projekt zu finden...

Ich hoffe, ihr habt eine paar gute Ideen.

asteroid.zip (370 KB)

AngelOfEffekt:
...
PlayerClass *player = new PlayerClass()
...

Evtl. liegt‘s am „new“. das ist AFAIK in der avrlibc nicht definiert (den Befehl gibt es da gar nicht).

Gruß

Gregor

New und delete gehen schon. Das ist durch die Arduino IDE implementiert (das sind Operatoren die man überladen kann). Sollte aber nicht nötig sein. Das Objekt statisch und global anzulegen sollte reichen.

Serenifly:
New und delete gehen schon. Das ist durch die Arduino IDE implementiert (das sind Operatoren die man überladen kann).

Huh?! In der Referenz finde ich new und delete auf die Schnelle nicht.

Gruß

Gregor

In der Referenz steht ja auch nicht alles drin. Schau in die Core Dateien

gregorss:
Huh?! In der Referenz finde ich new und delete auf die Schnelle nicht.

New und delete findest du in der C++ Referenz.
Und ja, die ist auch für Arduinos gültig.
Eingeschränkt, aber gültig.

Serenifly:
In der Referenz steht ja auch nicht alles drin.

Dann ist das IMO entweder eine wirklich schlechte Referenz oder das ist absichtlich verstecktes Geheimwissen (wobei ich mich fage, wieso man das versteckt).

Gruß

Gregor

combie:
New und delete findest du in der C++ Referenz.
Und ja, die ist auch für Arduinos gültig.
Eingeschränkt, aber gültig.

Ja, klar, in einer „echten“ C++-Referenz stehen new und delete schon drin. Aber eben nicht in der hiesigen. Ich halte das für eine so große Einschränkung, dass ich das auch mit Einschränkungen nicht als „gültig“ bezeichnen würde.

Gruß

Gregor

Zum Problem: Du mußt überall die benötigten Header einbinden, in denen die Deklarationen der benutzten Klassen stehen.

Wieso ist im .ino #include Player.h auskommentiert?

Woher soll der Compiler in Player.h wissen, was ParticleClass ist?

Es lag tatsächlich nur an der Bekanntgabe von ParticleClass für PlayerClass.

Ich als diese noch fehlte und ich PlayerClass durch ein include in die .ino holte, bekam ich einen Fehler a la

error: expected class-name before '{' token

Nach Recherchen darüber kam ich zu Lösungen, die besagen, dass ich die Klasse nur über "class PlayerClass" bekannt machen könne (das von mir angesprochene Thema mit dem Zirkelverweis). Stellt sich ja nun als Quatsch heraus :wink:

Danke Dir soweit :slight_smile: