2012-04-07 4 views
0

In meinem Projekt gibt es eine Basisklasse und es gibt 3 verschiedene abgeleitete Klassen. Ich habe einige Makrovariablen, die in der Basisklasse als const int geschrieben sind. Alle abgeleiteten Mitglieder werden auf diese Mitglieder zugreifen und denselben Wert sehen. Da es ein const ist, und es wird sich nicht ändern, wird die Beibehaltung von 3 verschiedenen Werten Platzverschwendung sein. Daher möchte ich einen Weg, um nur eine Kopie der Konstanten der Basisklasse beizubehalten, so dass alle abgeleiteten Klassen die gleichen verwenden.So vermeiden Sie doppelte Kopien der Basisklassenelemente in der abgeleiteten Klasse in C++

Beispiel

//Base.hpp 
Class Base { 

     const int ZER0; 
     const int ONE; 
}; 

//Derived1.hpp 
class Derived1:public Base { 
     int some_method1(); 
}; 

    //Derived1.cpp 

    int Derived1::some_method1() { 

    int value = ZERO; 
    } 

//Derived2.hpp 

class Derived2:public Base { 
    int some_method2(); 
}; 

//Derived2.cpp 

int Derived2::some_method2() { 
    int value = ONE; 
} 

//main.cpp 

Derived1 d1; 
d1->some_method1(); 

Derived d2; 
d2->some_method2(); 

// Hier in beiden Verfahren die Werte konstant sind, aber immer noch die Null und Eins gehen anderen Raum haben. Gibt es einen Weg, wo ich nur eine Kopie aufbewahre? Ich könnte an statische Variable denken. Ist es in Ordnung, statische innerhalb der Klasse zu verwenden und wo initialisiere ich die statische Variable. Bitte um Rat.

PS: Diese Fragen könnten ein Duplikat sein, aber ich kann etwas mit ähnlichen Wörtern nicht finden, wenn Sie das Gefühl haben, wenden Sie sich bitte an den entsprechenden Artikel/Frage;

+0

I "My First Home-grown RTTI Umsetzung" riechen hier, und wenn ja, benutzen Sie einfach ' dynamic_cast' für solche Dinge. – Puppy

+0

Vielleicht sollten Sie 'statische' Klassenmitglieder verwenden. –

+0

^Ja, ich denke, statische ist der Weg zu gehen, ich werde es verwenden. – howtechstuffworks

Antwort

2

Wenn ich Sie richtig verstehe, würde ein enum tun, was Sie suchen?

class Base 
{ 
    enum 
    { 
     ZERO, 
     ONE 
    }; 
}; 
+0

Nun, es hängt davon ab, ZERO und ONE sind nur Beispiele in meinem Programm, nicht unbedingt ZERO und ONE wird von zwei gefolgt. Natürlich können wir Enum zum Definieren von Variablen verwenden, aber meine Frage wäre, wenn enum NULL und EINS hat, wie viele Kopien werden von der abgeleiteten Klasse d1 und d2 gesehen? wenn es zwei geben wird, nein, wenn die Kopien nur eins für beide Elemente sein werden, ja, das ist, was ich suche :) – howtechstuffworks

+1

@howtechstuffworks eine Enum-Konstante ist keine Variable, sondern ein literaler Wert festverdrahtet in Ihr Programm zur Kompilierzeit; es gibt keine "Kopien" - es wird nicht einmal zur Größe Ihrer Klasse oder eines Ihrer Objekte beitragen, da es keine Präsenz im Speicher hat (Sie können die Adresse eines Enums nicht konstant halten, weil es so ist) hat keine Adresse). Natürlich können Sie weiterhin int-Variablen deklarieren, um diese Werte zu speichern, aber die enum-Deklaration selbst hat keinen Laufzeit-Footprint. –

+0

Wow, dann würde das helfen, denke ich, Danke! Noch eine Frage, also kann ich das Enum in meiner Klasse deklarieren und auf abgeleitete Klasse zugreifen, oder? oder sonst kümmert sich enum nicht um Klassen? – howtechstuffworks

0

Ich glaube, Sie möglicherweise virtuelle Basis inheritence verwenden, um eine Kopie der Basis zu halten ..

//Base.hpp 
class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
protected: 
    static const int ZER0; 
    static const int ONE; 
}; 

//Base.cpp 
const int Base::ZER0 = 0; 
const int Base::ONE = 1; 

//Derived1.hpp 
class Derived1 : public virtual Base { //using virtual keyword here maintains one copy of base class, thus one copy of ONE and ZERO for all objects since they are static members of Base. You must read about diamond problem of virtual inheritence to understand this properly. 

public: 
    Derived1() :Base() {} 
    int method1(); 
}; 

//Derived1.cpp 

int Derived1::method1() { 
    int value = ZER0; 
    return value; 
} 

//Derived2.hpp 

class Derived2 : public virtual Base { 
public: 
    Derived2() :Base() {} 
    int method2(); 
}; 

//Derived2.cpp 

int Derived2::method2() { 
    int value = ONE; 
    return value; 
} 

//main.cpp 


int main() { 
    Derived1 d1; 
    d1.method1(); // . instead of -> , -> is used for member access through pointers 

    Derived2 d2; 
    d2.method2(); 

    return 0; 
} 
Verwandte Themen