2016-04-30 12 views
3

Ich machte die Klasse Kopf und Klasse Abgeleitet von der Klasse Head. Was sollte ich tun, um eine statische Variable (wie einen Zähler des Objekts der Klasse Head) zu haben, die in der abgeleiteten Klasse nicht erhöht wird?Die statische Variable in der abgeleiteten Klasse wurde nicht inkrementiert

In Kopfklasse:

class Head{ 
    private: 
     static int counter; 
     string name; 
     int amount; 
    public: 
     Head(const string& n):name(n){ 
      counter++; 
     } 
}; 
int Head::counter=0; 

und in der Klasse Derived:

class Derived: public Head{ 
    public: 
     Derived(const string& n):Head(n){}; 
}; 

Mein Ziel ist Zähler nicht erhöht werden, wenn ich neues Objekt der Klasse Derived erstellen. Was soll ich verwenden? Virtuelle Klasse, kann mir jemand erklären, wie ich dieses Problem lösen kann?

+0

Es ist nicht wirklich klar, möchten Sie vielleicht den Zähler nicht erhöhen, wenn Sie ein Objekt der Klasse Abgeleitet erstellen? (Sie haben Kopf im Text geschrieben) – user463035818

+0

Warum wollen Sie dieses Verhalten? Wenn ein Objekt von Derived erstellt wird, erstellen Sie tatsächlich auch ein Objekt der Klasse Head (als Teil des Derived-Objekts). – user463035818

+0

yup, ich möchte Zähler nicht inkrementieren, wenn ich Objekt der abgeleiteten Klasse creade, sorry – masterq007

Antwort

2

Machen Sie eine bedingte in Ihrem Konstruktor (völlig ungetestet):

class Head{ 
    private: 
     static int counter; 
     string name; 
     int amount; 
    public: 
     Head(const string& n, bool increment = true):name(n) { 
      if (increment) { 
       counter++; 
      } 
     } 
}; 
int Head::counter=0; 

und in der Klasse Derived:

class Derived: public Head{ 
    public: 
     Derived(const string& n):Head(n, false){}; 
}; 
+0

Während dies funktioniert, ist es wirklich schlechtes Design. –

+0

Es sollte nur funktionieren, mir ist nicht bewusst, warum das OP will dieses Verhalten und vielleicht eine Menge könnte neu gestaltet werden. – totoro

0

segregieren ctors, fügen Sie eine weitere geschützte Ctor für abgeleitete Klassen?

struct Base { 
    Base(const string &); 
protected: 
    Base(nullptr_t, const string &); 
}; 

struct Derived: Base { 
    Derived(const string &s): Base(nullptr, s) {} 
}; 
0

Sie könnten nur Überlastung die constructor durch dieSignatur zu ändern.

class Head{ 
    private: 
    static int counter; 
    string name; 
    int amount; 
    public: 
    Head(){} 
    Head(const string& n):name(n) {count++;} 
    Head(const string& n,int a):name(n) {} 
} 
int Head::counter=0; 



class Derived{ 
    public: 
     Derived(const string& n):Head(n,1){}; 
} 
Verwandte Themen