Vererbung und die Anzeige der Daten im Debug-Inspektor
-
Hallo,
ich habe folgendes Problem. Zuerst etwas Erklärung und Code. Ich habe zwei Klassen, die eine TSerialCom die den Zugriff auf die seriellen Schnittstellen ermöglicht:
Die .h dazu:class TSerialCom { public: DWord ComWrite (char* buffer, int BytesToSend); DWord ComRead (char* buffer, int BytesToRead); int ComOpen (int CPort, int Bd, int DataB, int Par, int StopB); void ComClose (void); __fastcall TSerialCom(void); __fastcall ~TSerialCom(void); private: HANDLE hComm[10]; COMMTIMEOUTS ctmoNew; COMMTIMEOUTS ctmoOld; int ComPort, Baudrate, DataBits, Parity, StopBits; };Jetzt gibt es eine zweite Klasse USS die die Funktionalität eines bestimmten Übertragungprotokolls ermöglicht. Da diese die Funktionen von TSerialCom braucht:
uss.h:
class USS : public TSerialCom { private: int ussTyp; TSerialCom *Port; struct NettoData { unsigned __int16 Lge, Adr, Ak, Pnu, Ind, Pwe[PWE_VAR], Pzd1, Pzd2, Pzd3, Pzd4, Pzd5, Pzd6; }; public: USS (int Com, int Baud, int Data, int Parity, int Stop); ~USS(); void Xmit (void); void Init (void); NettoData Tx, Rx; int UssErrorCode; AnsiString UssErrorStr; };Der Konstruktor von USS:
USS::USS (int Com, int Baud, int Data, int Parity, int Stop) { Port = new TSerialCom(); ussTyp = USS2; //Voreinstellung 4/6 Worte Port->ComOpen(Com, Baud, Data, Parity, Stop); Init(); UssErrorCode = 0; UssErrorStr = ""; }Der Destruktor von USS:
USS::~USS() { Port->ComClose(); delete Port; }Und jetzt der eigentliche Aufruf, aufs Wesentliche reduziert:
USS *C1 = new USS(COM1, 9600, 8, EVEN, 1); C1->Xmit(); delete C1;Funktionieren tut eigentlich alles. Mit dem Erzeugen des Objektes C1 wird die Schnittstelle korrekt geöffnet, die Daten können übertragen werden, mit dem delete wird die Schnittstelle geschlossen. Funktionell also alles ok.
Wenn ich jedoch nach dem Aufruf von USS *C1 = new .... mir mit Alt+F5 den Debug Inspektor ansehe, sind in den Daten die in TSerialPort.h als private deklarierten Variablen ComPort, Baudrate usw. dort sichtbar. Allerdings mit völlig unsinnigen Werten. Das Anzeigen von z.B. C1->Port->Baudrate ergibt den korrekten Wert von 9600. Wenn ich mir die Eigenschaften vom Objekt Port anzeigen lasse ist logischerweise auch alles ok.
Nur das die als private deklarierten Variablen im Debug Inspektor von C1 mit unsinnigen Werten angezeigt werden macht mich etwas stutzig. Muss mir das zu denken geben oder ist das einfach so?Grüße,
Jochen
-
was sind denn das fuer unsinnige werte? werden in ComOpen die privaten elemente gesetzt (steht ja nirgends)? sind natuerlich nur die werte gesetzt, die du auch initialisierst, alle anderen sind undefiniert.
-
Hallo,
Das liegt wohl daran, dass du von TSerialCom erbst aber diese Variablen im Konstruktor nicht initialisierst. Da du eine Membervariable von diesem Typ in USS hast brauchst du das doch eigentlich garnicht. Lass also USS einfach nicht von TSerialCom erben.
-
Braunstein schrieb:
... Lass also USS einfach nicht von TSerialCom erben.
Jep, manchmal kann es wirklich einfach sein, Danke!
