Форум программистов, компьютерный форум CyberForum.ru

Класс, знающий все свои экземляры - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Структуры данных(СТЕК) http://www.cyberforum.ru/cpp-beginners/thread842873.html
Помогите написать, или исправьте, плиз, мою программку. Здесь - стек. надо создать меню, где можно вывести, создать и удалить элемент со стека. Вот мой вариант программки(но там, почему-то не определяет функции): #include <iostream> #include <string> using namespace std; int N_used=0;
C++ Классы: ка победить ошибку из "const Type" в "Type &" Создаю свой класс class MyClass {private: int *dat; WCHAR *buf; inline size_t GetLength(){return dat? dat: 0;}; public: const MyClass& operator +=(const MyClass& val); .....} http://www.cyberforum.ru/cpp-beginners/thread842866.html
C++ Структура: Написать функцию, которая записывает в бинарный файл данные о сканере из приведенной структуры.
Для хранения данных о планшетных сканерах описать структура вида: struct scan_info{ char model; //наименование int price; //цена double x_size; //горизонтальный размер области сканирования double y_size; //вертикальный размер области сканирования int optr; оптическое разрешение int grey; //число градаций серого }; Написать функцию, которая записывает в бинарный файл данные о сканере из...
Рекурсивная функция. Преобразовать массив, прибавив к четным числам последний элемент C++
Решить задачу в консольном режиме. Программирование с использованием функций. Рекурсивная функция Дан целочисленный массив размера N. Преобразовать его, прибавив к четным числам последний элемент. Последний элемент массива не изменять. Осуществить сдвиг влево на k позиций, где k – число нечетных элементов
C++ Работа с указателями и функциями ( запись в двоичный файл данных только о тех ноутбуков диагональ дисплея которых больше 11 дюймов) http://www.cyberforum.ru/cpp-beginners/thread842851.html
Для хранения данных о ноутбуках описать структуру вида: struct NOTEBOOK { char model;//наименование int price; //цена float w; //вес struct size{ //габаритные размеры float x;//высота float y;//длина float z;//ширина
C++ Обработка массивов (Найти количество положительных элементов, расположенных в заштрихованной части матрицы) Программирование алгоритмов сортировок элементов массивов. Решить задачу в консольном режиме. Дана действительная квадратная матрица порядка n. Найти количество положительных элементов, расположенных в заштрихованной части матрицы. подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2013, 21:08     Класс, знающий все свои экземляры
taras atavin, Класс знающий о своих инстансах - само по себе бредово. Вот класс менеджер знающих об инстансах конкретного класса было бы вполне себе ок.

Добавлено через 18 минут
Вот так будет несколько приятнее.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <vector>
#include <iostream>
#include <string>
 
class A
{
public:
    A(const std::string& n) : name(n)
    {
        push_instance();
    }
    A(const A& rhs) : name(rhs.name)
    {
        push_instance();
    }
    ~A()
    {
        std::cout << "Pop: " << name << std::endl;
        instances.pop_back();
    }
private:
    void push_instance()
    {
        std::cout << "Push: " << name << std::endl;
        instances.push_back(this);
    }
    std::string name;
    static std::vector<A*> instances;
};
 
std::vector<A*> A::instances;
 
int main()
{
    A a("1");
    A b("2");
}
А вот так будет несколько правильнее.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <vector>
#include <iostream>
#include <string>
 
template<typename T>
class InstanceCounter
{
public:
    static InstanceCounter<T>& instance()
    {
        static InstanceCounter<T> inst;
        return inst;
    }
    void push_instance(const T* const ptr)
    {
        instances.push_back(ptr);
    }
    void pop_instance()
    {
        instances.pop_back();
    }
    int instances_size()
    {
        return instances.size();
    }
private:
    InstanceCounter(const InstanceCounter&);
    InstanceCounter& operator = (const InstanceCounter&);
    InstanceCounter() {}
    std::vector<const T*> instances;
};
 
class A
{
public:
    A(const std::string& n) : name(n)
    {
        push_instance();
    }
    A(const A& rhs) : name(rhs.name)
    {
        push_instance();
    }
    ~A()
    {
        std::cout << "Pop: " << name << std::endl;
        InstanceCounter<A>::instance().pop_instance();
    }
private:
    void push_instance()
    {
        std::cout << "Push: " << name << std::endl;
        InstanceCounter<A>::instance().push_instance(this);
    }
    std::string name;
};
 
int main()
{
    InstanceCounter<A>& cnt = InstanceCounter<A>::instance();
    std::cout << cnt.instances_size() << std::endl;
    {
    A a("1");
    A b("2");
    std::cout << cnt.instances_size() << std::endl;
    }
    std::cout << cnt.instances_size() << std::endl;
}
 
Текущее время: 12:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru