Announcement

Collapse
No announcement yet.

Problem mit Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Klasse

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop
    #include <iostream.h>
    //---------------------------------------------------------------------------
    #pragma argsused

    class CZaehler
    {
    protected:
    int zaehler;
    public:
    CZaehler(void);
    void INC(int sw = 1);
    int GetStand(void);
    }Count;

    CZaehler::CZaehler(void)
    { zaehler = 0; }
    void CZaehler::INC(int sw)
    { zaehler = zaehler + sw; }
    int CZaehler::GetStand(void)
    { return zaehler; }

    //---------------------------------------------------------------------------

    class CSuperzaehler : public CZaehler
    {
    public:
    CSuperzaehler(int z = 0);
    void DEC(int sw = 1);
    void Reset(int rz = 0);
    }TopCount;

    CSuperzaehler::CSuperzaehler(int z)
    { zaehler = z; }
    void CSuperzaehler:EC(int sw)
    { zaehler = zaehler - sw; }
    void CSuperzaehler::Reset(int rz)
    {
    try
    {
    zaehler = rz;
    if(zaehler < 0)
    {
    throw 0;
    }
    }
    catch(int x)
    {
    zaehler = x;
    }
    }
    //---------------------------------------------------------------------------
    int main(int argc, char* argv[])
    {
    CSuperzaehler(10);
    for(int i = 1; i < 5; i++)
    {
    TopCount.DEC(1);
    }
    cout << TopCount.GetStand() << endl << endl;

    system("Pause");
    return 0;
    }
    //---------------------------------------------------------------------------
    Eigentlich sollte 6 rauskommen es kommt aber immer -4 raus wieso ?

  • #2
    ganz einfach: du hast nen denkfehler drin.
    wenn du CSuperzaehler(10) aufrufst, ruft der Konstruktor von CSuperzaehler anschließend den Konstruktor von CZaehler auf.
    Du schreibst also erst
    Zaehler = 10
    und anschließend
    Zaehler = 0.
    Und wenn der Startwert von Zaehler bei 0 liegt, kommt selbstredend -4 als Ergebnis raus.

    Comment


    • #3
      Schon mal debuggt?

      EDIT
      Selbsthilfe entfällt nunmehr
      Christian

      Comment


      • #4
        Ja ich bin mit den Debugger durch gegangen....
        Warum rechnet er dann aber richtiger wenn ich bei den Konstruktor von CSuperzaehler zaehler = 10 schreib ?

        Comment


        • #5
          was meinst du mit
          rechnet er dann aber richtiger
          ??

          Comment


          • #6
            Hi!

            @mez: Deine Aussage ist falsch. Basisklassen werden immer zuerst konstruiert, d.h. es werden erst die Basiskonstruktoren aufgerufen, bevor der Konstruktor der abgeleiteten Klasse durchlaufen wird. Schließlich will ja die abgeleitete Klasse evtl. die Basisklasse benutzen. Dazu muss die aber erstmal fertig konstruiert sein.

            @Manuel09: TopCount ist eine globale Variable ist, die mit dem Standardwert des Konstruktors CSuperzaehler (also 0) konstruiert wird, bevor überhaupt main() aufgerufen wird. Wenn dann dieser Wert 4x um eins reduziert wird, ergibt sich eben -4.

            Vermutlich sollte die erste Zeile in main so lauten: TopCount = CSuperzaehler(10);
            Denn hiermit "CSuperzaehler(10);" wird zwar eine Instanz von CSuperzähler erzeugt, aber keiner Variablen zugeordnet. TopCount bleibt daher zunächst 0.

            Gruß
            Ralf
            Zuletzt editiert von RastiX2; 22.04.2010, 18:09.

            Comment


            • #7
              Achso danke das ist verständlich.
              mfg

              Comment

              Working...
              X