Zum Inhalt springen

Probleme mit #include in header


Empfohlene Beiträge

Geschrieben

guten tag die herren,

erster post und gleich ne nette frage. es geht um folgendes.

ich persönlich bin ein ziemlicher fan von learning-by-doing und hab mich nach den üblichen vorarbeiten einfach mal an ein schon etwas größeres projekt gesetzt. genau genommen geht es dabei um eine kommunikation mit einem endgerät über die serielle schnittstelle (rs485).

ich bin ja nun nicht blöde und hab mir ein fertiges interface ausm netz gezogen, und zwar von hier: Serial Communication for WIN32 (Event-driven)

wie unschwer zu erkennen ist (ganz runtr scrollen) will der autor dass ich einen callback verwende, was aber bei der oop wohl erstens nicht so sinnig zu sein scheint und außerdem an meine grenzen geht.

ich hab mir also gedacht, maik, hab ich mir gedacht, übergib dem tserial_event doch einfach eine referenz auf mein schnittstellenobjekt und ruf dann die betreffende methode einfach so auf.

aber, man kennts ja, es will nicht.

das ist meine schnittstelle.h

#ifndef SCHNITTSTELLE_H

#define SCHNITTSTELLE_H


#include <conio.h>

#include "Tserial_event.h"


class Schnittstelle{


private:

	void SerialEventManager(uint32 object, uint32 event);

	void OnDataArrival(int size, char *buffer);

	void SerialCallback(Tserial_event *com_source, uint32 event);


	Tserial_event* com;

	int            c;

    int            error;

    char           txt[32];

	char*          buffer;

    int            size;


public:

		Schnittstelle();

		~Schnittstelle();

};


#endif SCHNITTSTELLE_H
das der konstruktor in schnittstelle.cpp mit dem callback den ich umgehen will (auskommentiert)
Schnittstelle::Schnittstelle(){



    com = new Tserial_event();

    if (com!=0)

    {

		//com->setManager(SerialEventManager);

		com->owner = (void *) this;

        error = com->connect("COM5", 9600, SERIAL_PARITY_NONE, 8, false);
auf jedenfall bekomme ich, wenn ich nun in die tserial_event.h das #include "Schnittstelle.h" einfüge, böse fehlermeldungen aus denen ich, ehrlich gesagt, nicht schlau werde...

Fehler	4	error C2061: Syntaxfehler: Bezeichner 'uint32'	c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h	10	


Fehler	5	error C2061: Syntaxfehler: Bezeichner 'Tserial_event'	c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h	12	


Fehler	6	error C2143: Syntaxfehler: Es fehlt ';' vor '*'	c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h	14	


Fehler	7	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.	c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h	14	


Fehler	8	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.	c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h	14	

Ich hoffe ihr könnt mit den gegebenen informationen anfangen und mich vom kommenden wahnsinn bewahren,

euer maik

Geschrieben

auf jedenfall bekomme ich, wenn ich nun in die tserial_event.h das

#include "Schnittstelle.h"

einfüge, böse fehlermeldungen aus denen ich, ehrlich gesagt, nicht schlau werde...

Hast du bemerkt, dass in Schnittstelle.h wiederum die Tserial_event.h eingebunden wird?

Wenn du das machst, binden sich die Dateien gegenseitig ein, das funktioniert nicht. Über die Includedirektiven kann man Headerdateien vor anderem Code einbinden. Es können aber nicht zwei Dateien gleichzeitig jeweils vor der anderen sein.

Die Include-Guards (#ifndef/#define/#endif) sorgen dafür, dass hier keine Endlos-Include-Rekursion passiert, aber trotzdem steht hinterher eine der beiden Dateien hinter der anderen.

In den meisten Fällen lässt sich das mit Forward Declarations auflösen.

Ich weiß nicht, ob Schnittstelle.h in Tserial_event.h gebraucht wird, aber die Includedirektive für Tserial_event.h in Schnittstelle.h ist nicht unbedingt notwendig. Hier wird nur ein Zeiger des Typs Tserial_event benutzt, ohne auf irgendwelche Member zuzugreifen. Dafür reicht auch eine Forward Declaration.

Ersetz also die Includedirektive für Tserial_event.h in Schnittstelle.h durch

class Tserial_event;
// oder struct Tserial_event, was auch immer Tserial_event ist.[/code]

Geschrieben

ich hab jetzt die includedirektive in Tserial_event.h duch

class Schnittstelle;

ersetzt, da ja die Schnittstelle das objekt von tserial erstellt.

ich hoffe mal ich hab da richtig mitgedacht.

wenn ich nun bei der erzeugung des tserialobjekts mit

com = new Tserial_event((Schnittstelle*) this) die referenz auf die erzeugende schnittstelle übergebe und der konstruktor wie folgt aussieht


Tserial_event:Tserial_event(Schnittstelle* pSchnittstelle){

   Schnittstelle = pSchnittstelle;


   Schnittstelle.test();

erhalte ich die fehlermeldung
Fehler	4	error C2228: Links von ".test" muss sich eine Klasse/Struktur/Union befinden.	c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\tserial_event.cpp	128	

Geschrieben

darstellungsfehler meinerseits

die zwei unteren Schnittstellen sind ne variable, der ich vorher mySchnittstelle übergeben habe.

ich möchte nun über diese referenz eine methode des objekts (my)Schnittstelle aufrufen...

er beklagt sich nur immer, rechts von .test(); müsste ne klasse/union/whatever stehen.

Geschrieben
die zwei unteren Schnittstellen sind ne variable, der ich vorher mySchnittstelle übergeben habe.

ich möchte nun über diese referenz eine methode des objekts (my)Schnittstelle aufrufen...

Diese Variable kann nur ein Zeiger sein (also Schnittstelle*), sonst würde die Zuweisung nicht funktionieren.

er beklagt sich nur immer, rechts von .test(); müsste ne klasse/union/whatever stehen.
Bei Zeigern benutzt man den Pfeiloperator, nicht den Punktoperator.
Geschrieben

hab den fehler gefunden.

musste noch in Tserial_event.cpp die "Schnittstelle.h" inkludieren und dann mit dem pfeiloperator arbeiten.

jetzt läufts soweit, nun werd ich mich an die implementierung von nem timer machen.

großes dankeschön meinerseits, hast mir wirklich geholfen!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...