2016-04-30 4 views
3

Я создал класс Глава и класс Производные из класса Head. Что мне делать, чтобы иметь переменную static (как счетчик объекта класса Head), которая не увеличивается в производном классе.Не увеличивая статическую переменную в производном классе

В классе Руководитель:

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

и в классе Derived:

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

Моя цель не увеличивать счетчик, когда я создаю новый объект класса Derived. Что я должен использовать? Виртуальный класс, может кто-нибудь объяснить мне, как решить эту проблему?

+0

Не совсем понятно, возможно, вам не нужно увеличивать счетчик при создании объекта класса Derived? (вы написали Head в тексте) – user463035818

+0

Зачем вам это поведение? Когда объект Derived создается, вы на самом деле также создаете объект класса Head (как часть объекта Derived) – user463035818

+0

yup, я не хочу увеличивать счетчик, когда я создаю объект класса Derived, извините – masterq007

ответ

2

сделать условный в конструкторе (полностью непроверенной):

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; 

и в классе Derived:

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

Хотя это будет работать, это действительно плохой дизайн. –

+0

Это было просто предназначено для работы, я не знаю, почему OP хочет этого поведения, и, возможно, многое может быть переработано. – totoro

0

Segregate ctors, добавьте еще один защищенный CTOR для производных классов?

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

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

Вы могли бы просто перегрузкиconstructor путем изменения подпись.

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){}; 
} 
Смежные вопросы