Другие языки программирования и технологии
С++ Наследование и статические переменные
Есть базовый класс и два порожденных, нужно сделать отдельный счетчик созданных объектов для каждого порожденного класса. Компилятор выдает ошибку при объявлении статической переменной в порожденных классах. Посоветуйте, как выйти из ситуации?
#include <iostream>
class counter {
public:
static void inc_a() { ++count_a_; }
static void dec_a() { --count_a_; }
static void inc_b() { ++count_b_; }
static void dec_b() { --count_b_; }
protected:
static int count_a_;
static int count_b_;
};
struct a : counter {
a() { inc_a(); }
~a() { dec_a(); }
static int count_a() { return count_a_; }
};
struct b : counter {
b() { inc_b(); }
~b() { dec_b(); }
static int count_b() { return count_b_; }
};
int counter::count_a_ = 0;
int counter::count_b_ = 0;
int main() {
a oa1;
std::cout << "a: " << oa1.count_a() <<'\n';
a o2;
std::cout << "a: " << oa1.count_a() << '\n';
oa1.~a();
std::cout << "a: " << o2.count_a() << '\n';
b ob1;
std::cout << "b: " << ob1.count_b() << '\n';
b ob2;
std::cout << "b: " << ob1.count_b() << '\n';
ob1.~b();
std::cout << "b: " << ob2.count_b() << '\n';
system("pause");
}
class counter {
public:
static void inc_a() { ++count_a_; }
static void dec_a() { --count_a_; }
static void inc_b() { ++count_b_; }
static void dec_b() { --count_b_; }
protected:
static int count_a_;
static int count_b_;
};
struct a : counter {
a() { inc_a(); }
~a() { dec_a(); }
static int count_a() { return count_a_; }
};
struct b : counter {
b() { inc_b(); }
~b() { dec_b(); }
static int count_b() { return count_b_; }
};
int counter::count_a_ = 0;
int counter::count_b_ = 0;
int main() {
a oa1;
std::cout << "a: " << oa1.count_a() <<'\n';
a o2;
std::cout << "a: " << oa1.count_a() << '\n';
oa1.~a();
std::cout << "a: " << o2.count_a() << '\n';
b ob1;
std::cout << "b: " << ob1.count_b() << '\n';
b ob2;
std::cout << "b: " << ob1.count_b() << '\n';
ob1.~b();
std::cout << "b: " << ob2.count_b() << '\n';
system("pause");
}
Сергей Злобин
Это работает только потому что создаются объекты одного класса.
Сергей Злобин
Тут один счётчик на все классы. А нужен отдельный счётчик на каждый класс.
Надо учитывать, что статические члены класса привязаны к классу только в исходном коде, но не во время выполнения программы. В С++ нельзя создать переменные класса или методы класса.
Надо разобраться почему компилятор выдает ошибку. статической - не static надеюсь
Ооо Лидер
static int count, а в чем тут проблема может быть?
Код на ideone или pastebin или gist или ещё куда-нибудь, только не сюда
Ты так хочешь сделать? https://ideone.com/zxzhqj
Ты так хочешь сделать? https://ideone.com/zxzhqj
Ооо Лидер
весь код огромный, скинул отрывок
class Publication2 : private Publication
{
...
};
class Book : public Publication2
{
private:
int quantity;
static int countB;
...
}
class Type : public Publication2
{
private:
int time;
static int countT;
...
}
class Publication2 : private Publication
{
...
};
class Book : public Publication2
{
private:
int quantity;
static int countB;
...
}
class Type : public Publication2
{
private:
int time;
static int countT;
...
}
Похожие вопросы
- Где размещаются статические переменные программы?
- Чем отличаются статические и глобальные переменные?
- С# - нужно сделать так, чтобы консоль читала слова, как переменные, а не просто слова...
- Как сложить переменную ? Delphi 7 Что никто не знает ответа что ли ?Н
- Снова Паскаль) ) Переменные и занимаемая ими память
- Указатели это переменные в которых содержатся адреса других переменных?
- С++, объект класса, экземпляр класса, какой тип переменной хранит экземпляр класса? (экземпляр это что? Word, lpstr..?)
- Как вернуть значение переменной присвоенное ранее? Pascal
- [C++] Почему не рекомендуют использовать глобальные переменные?
- VisualC++ 2010. При выборе MFC - статической библиотеки программа не компилируется.