Problem mit Zugriff auf Klassen



  • Hallo,
    hab da mal wieder ein Problem.
    Ich habe in meinem Programm eine Klasse CTH200COM um mit einem Gerät zu Kommunizieren. Dann habe ich noch eine Klasse SerialPort, in der alle Funktionen sind, die ich zur Kommunikation brauch, zB. um Port zu öffnen, Daten zu senden....

    Nun möchte ich in TH200COM.cpp die Schnittstelle konfigurieren, also wollte ich ein Object von SerialPort erzeugen. Das wollte ich so machen:

    //TH200COM.h
    
    SerialPort MyCOM;
    
    //TH200COM.cpp
     MyCOM.DC_Com_Properties.BaudRate = 1200;	//property settings 
     MyCOM.DC_Com_Properties.ByteSize = 8;
     MyCOM.DC_Com_Properties.Parity = NOPARITY;
     MyCOM.DC_Com_Properties.StopBits =1;
     MyCOM.DC_Com_Properties.fOutxCtsFlow=0;
     MyCOM.DC_Com_Properties.fOutxDsrFlow=0;
    

    Jetzt kommt allerdings beim Kompilieren die Fehlermeldung "MyCOM nicht deklarierter Bezeichner.
    In einer anderen Klasse gabs damit keine Probleme, obwohl ich dort das gleiche gemacht habe.
    Warum?
    Was mache ich den falsch?



  • Hast du die .H Datei auch eingebunden? Und ist die Variable MyCOM eventuell in einem lokalen Scope versteckt, den du nicht direkt erreichen kannst?

    Ansonsten sehe ich noch einen potentiellen Konflikt mit der ODR - wenn du schon globale Variablen verwendest, dann definier' sie bitte nicht im Header, sondern in der .CPP (im Header brauchst du eine extern-Deklaration).



  • CStoll schrieb:

    Hast du die .H Datei auch eingebunden? Und ist die Variable MyCOM eventuell in einem lokalen Scope versteckt, den du nicht direkt erreichen kannst?

    Ansonsten sehe ich noch einen potentiellen Konflikt mit der ODR - wenn du schon globale Variablen verwendest, dann definier' sie bitte nicht im Header, sondern in der .CPP (im Header brauchst du eine extern-Deklaration).

    Genau, solltest du jedoch dennoch in der Header Datei die definition vornehmen, achte auch darauf das du Headerdateien nicht doppelt includest (z.B. wenn du diese Headerdatei in eine CPP Datei einbindest in welcher du vorher bereits die Headerdatei für die SerialPort Klasse eingebunden hast, um Konflikte zu vermeiden.)

    Grüße,
    inva



  • Hab echt den include vergessen *schäm*

    CStoll schrieb:

    wenn du schon globale Variablen verwendest, dann definier' sie bitte nicht im Header, sondern in der .CPP (im Header brauchst du eine extern-Deklaration).

    Was ist der Nachteil von globalen Variablen?
    Wenn ich sie aber Extern im Header deklariere, muss ich sie in jeder Funktion in der cpp-Datei definieren? Was ist der Vorteil davon?



  • Der Nachteil von globalen Variablen ist, daß sie global sind - damit kommt jede Funktion deines Programmes an sie dran, ohne daß du irgendeine Kontrolle darüber hast, was sie macht.

    @extern: Nein, du mußt (und darfst) eine Variable nur einmal definieren, andernfalls wird sich dein Linker beschweren. Das Problem ist, daß ein SerialPort MyCOM; eine Definition darstellt - wenn du das im Header hast, landet die Definition in jeder Übersetzungseinheit, die ihn verwendet. Die Lösung dafür lautet extern: extern SerialPort MyCOM; ist eine Deklaration - und die darf mehrfach vorkommen.
    (PS: Nein, gegen dieses Problem helfen keine Include-Guards)


Anmelden zum Antworten