Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Vererbung, Standardkonstruktor

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.10.2005, 19:17 Uhr
thomas67



Ich habe gegeben:

eine Basisklasse Class1 mit den Variablen a und b
und einen Standardkonstruktor Class1(), der z.B. a mit 1 und b mit 2 initialisiert.
(beides private-Variablen, protected ändert aber nichts)

Von dieser Klasse Class1 leite ich eine weitere Klasse Class2 ab
class Class2: public Class1,
welche z.B. die Variable c besitzt.

Ich will bei Class2 wiederum einen Standardkonstruktor einbauen, der z.B. c auf 3 setzen soll (ebenfalls private-Variable, protected ändert nichts)

Implementiert habe ich das mit
Class2::Class2() : Class1()
{
c = 3;
}

Deklariere ich jetzt im Programmcode

function xy()
{
class2 cl2_Testclass;
// (*)
....

}

dann sind bei // (*) die Variablen a und b von cl2_Testclass wie gewollt auf 1 und 2 gesetzt,
c jedoch hat irgendeinen beliebigen, unsinnigen Wert.

Arbeite ich mich schrittweise durch den (Standard-) Konstruktor,
so hat c innerhalb des Standardkonstruktors den Wert 3,
an der Stelle // (*) aber wieder den undefinierten Wert.

Waaaaaarum????
Standardkonstruktoren müssen doch auch bei abgeleiteten Klassen funktionieren. Will ja da noch eine weitere Klasse ableiten...
c ist in meinem Programm übrigens nur eine einfach double und eine int- Variable.
An einem fehlenden Include dürfte es nicht liegen

Dank im Voraus
Thomas


habe inzwischen auch eine Extra Memberfunktion setze_c für die class2 geschrieben,
auch hier hat c nur innerhalb dieser Memberfunktion den Wert 3, aber nicht ausserhalb dieser und innerhalb der Funktion xy;
Über eine Destruktorkontrolle bin ich mir sicher, daß cl2_TestClass erst wieder am Ende von xy zerstört wird...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.10.2005, 20:39 Uhr
ao

(Operator)


Vielleicht ein Effekt des Optimierers? Wird denn cl2_Testclass danach noch benutzt? Falls nicht, könnte es wegoptimiert worden sein. Schalte mal in den Projektoptionen alle Optimierungen aus, oder schalte um von Release- auf Debug-Version.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.10.2005, 22:43 Uhr
Spacelord
Hoffnungsloser Fall


Zeig doch mal den "echten" Code.

Zitat von thomas67:

c ist in meinem Programm übrigens nur eine einfach double und eine int- Variable.


Was denn nun? double oder int?

Und warum rufst du in der Initialisierungsliste explizit den Standardkonstruktor der Basisklasse auf?Das passiert implizit ohnehin.

Aber generell sollte der Code den du da oben gepostet hast schon funktionieren.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.10.2005, 02:34 Uhr
thomas67



Dank erst mal,
dachte, an der Optimierung könnts liegen, da ich die Variablen noch nicht weiter verwendet hab, erst mal die Initialisierung testen wollte.... wars aber nicht

Funktioniert immer noch nicht...


ok,
Ausschnitte aus dem echten Code.... soll mal auf Währungsoptionen rauslaufen...


C++:
************** Headers...

Basisclass
class cTKOption : public CObject
{
    DECLARE_SERIAL(cTKOption)

public:
                cTKOption ();   // Standardkonstruktor
.....
                ~cTKOption();   // Destruktor
private:
    CString     cstr_Whg1, cstr_Whg2;
    cTKDatum    cTKD_Expiry, cTKD_Delivery; // eigene Datumsklassen

};


1. abgeleitete

class cTKOptVarPO : public cTKOption
{
    
    DECLARE_SERIAL(cTKOptVarPO)

public:
                cTKOptVarPO();      // Standardkonstruktor
...
                ~cTKOptVarPO();     // Destruktor
...
    bool        bl_SetzeStrike(double dbl_Str); // True, wenn ok


private:
    double      dbl_Strike;     // Strike
    int         i_CallPut;      // 1 oder -1

};


*********  Implementierungen

....
Class 1
// Standardkonstruktor
cTKOption::cTKOption():cTKD_Expiry(1,1,2000), cTKD_Delivery(1,1,2000)
{
    
    cstr_Whg1 = "EUR";
    cstr_Whg2 = "USD";
    
}   // Standardkonstruktor
.....


Class 2
// Standardkonstruktor
cTKOptVarPO::cTKOptVarPO() : cTKOption()   // :cTKOption brauch ich evtl nicht
{

    dbl_Strike  = 1;
    i_CallPut   = 1;
        
}

und auch
// Strike setzen
bool cTKOptVarPO::bl_SetzeStrike(double dbl_Str)
{
    dbl_Strike = dbl_Str;
    return true;                 // vorerst abgekürzt..., false - Fälle folgen später

}   // Strike setzen


******** und hier der Prüfcode, der dann nicht funktioniert

bool bl_TesteOptionen()   // wird einfach in der Sichtinitialisierung aufgerufen
{

    cTKOptVarPO cTKOVP_Option1;
    double dbl_test;

    // Im Konstruktor ist dbl_Strike = 1.000000,   hier undefiniert   xy e-314


    cTKOVP_Option1.bl_SetzeStrike(1.2350);
    // dbl_Str wirklich 1,2350, aber dbl_Strike ändert sich nicht
        
    dbl_test = cTKOVP_Option1.dbl_GetStrike();
    // dbl_Test weiterhin Unsinn   xy  e-314.....
}




hilfts?

Dieser Post wurde am 13.10.2005 um 08:58 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.10.2005, 08:54 Uhr
ao

(Operator)


Aufn ersten Blick fällt mir nichts auf. Muss ich mal genauer unter die Lupe nehmen, das geht aber jetzt nicht. Ich meld mich.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2005, 01:43 Uhr
ao

(Operator)


Also, ich kann dein Problem hier nicht nachvollziehen. Habe ein paar fehlende Sachen ergänzt, um den Code übersetzbar zu machen, und der Einfachheit halber die Ableitung von CObject und DECLARE_SERIAL herausgenommen. Danach hat sich der Code genauso verhalten wie erwartet.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.10.2005, 01:00 Uhr
thomas67



Vieeeelen Dank!
Meiner Meinung nach sollte es ja auch so funktionieren,
nur ist halt leider mein Compiler anderer Meinung
Aber wenigstens schön, daß ich nicht der einzige bin, der das nicht versteht, und ich von Grund auf eigentlich richtig bin....
Hilft halt noch nicht viel.

Kanns an irgendwelchen Einstellungen liegen? Optionen?
Und DECLARE_/IMPLEMENT_SERIAL brauche ich ja bei class1 wie auch bei class2, oder?
zweifle inzwischen an allem....

Gruß und Dank
Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.10.2005, 01:42 Uhr
thomas67



Habe heute irgendwo in der Online-Hilfe gelesen, daß CObject eine Mehrfachvererbung, multiple inheritance nicht unterstützt....
Kann ich mir zwar kaum vorstellen, aber kann das der Grund für mein Problem sein?
Nur, wie mach ichs dann???
Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.10.2005, 10:45 Uhr
ao

(Operator)


Hi Thomas,
ich sehe da keine Mehrfachvererbung.
Mehrfachvererbung ist, wenn eine Klasse direkt von mehreren Basisklassen erbt, also sowas:

C++:
class CMeineKlasse : public CErsteBasis, public CZweiteBasis {};


ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.10.2005, 11:23 Uhr
thomas67



ach ja, logisch
hab ich wieder mal die Mehrfachvererbung mit der reihenweisen hintereinander vermischt.
sorry
und Danke
Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: