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! 🙂


Anmelden zum Antworten