Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/103: Рейтинг темы: голосов - 103, средняя оценка - 4.93
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001

Количество объектов класса

31.01.2015, 15:47. Показов 22661. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
недавно подцепил тут где то этот вопрос и меня что называется зацепило... думал думал так и не смог придумать как сделать счетчик созданных объектов класса? знаю статичная переменная бла бла бла... но не так то просто...
C++
1
2
3
4
5
6
7
8
class A
{
    static size_t m_count = 0;
public:
    A() { m_count++; }
    ~A() { m_count--; }
    const size_t& count = m_count;
};
казалось бы все правильно, но ! "error C2864: "A::m_count": статический элемент данных с инициализатором внутри класса должен иметь неизменяемый целочисленный тип const", а ведь инициализировать нулем ее так или иначе надо, чтобы было откуда инкрементировать... вот и задачка на засыпку
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2015, 15:47
Ответы с готовыми решениями:

Узнать размер (количество) массива объектов класса
Допустим, у меня есть такой массив объектов: TGameEnemy enemies = { TGameEnemy(), TGameEnemy(), TGameEnemy() }; Мне необходимо...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

Построение описания класса, создание и уничтожение объектов этого класса
Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть возможность раздельного изменения...

21
30 / 47 / 19
Регистрация: 23.10.2014
Сообщений: 1,001
01.02.2015, 12:42  [ТС]
Студворк — интернет-сервис помощи студентам
hoggy, проверил, не работает !!! ошибки правда пропали (хотя кстати зачем это вы наследуете numcopies публично в A? оно ж структура !), но количество экземпляров класса A теперь равно количеству созданных экземпляров классов A и B, а не только A, а вот у класса B numcopies работает теперь правильно !

Добавлено через 16 минут
з.ы. и кстати мне тут пришла в голову одна мысля по поводу наездов на мои изобретенные геттеры, а вот вы функции добавляете, они же тоже память какую то едят вроде? ну т.е. существуют же в памяти указатели на функции, таким образом мои ссылки жрут не больше памяти чем ваши функции !

Добавлено через 1 час 52 минуты
Цитата Сообщение от Dark Byte Посмотреть сообщение
з.ы. и кстати мне тут пришла в голову одна мысля по поводу наездов на мои изобретенные геттеры, а вот вы функции добавляете, они же тоже память какую то едят вроде? ну т.е. существуют же в памяти указатели на функции, таким образом мои ссылки жрут не больше памяти чем ваши функции !
да ! проверил
C++
1
size_t size = sizeof(main(0, nullptr, nullptr));
возвращает 4, ну т.е. как и у всех указателей 4 байта указатель весит и на функции есть указатели эти, так это полное гонево на мои геттеры, это ссылки, так что они тоже занимают по 4 байта и увеличивают размер класса не больше чем те же функции, зато использовать их проще
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.02.2015, 13:07
Цитата Сообщение от Dark Byte Посмотреть сообщение
хотя кстати зачем это вы наследуете numcopies публично в A? оно ж структура !
Это ваш код изначально. Мне было лень его править, потому что разницы все равно нет.

Если б я писал его с нуля, я б не стал писать public,
потому что обычно мне лень без необходимости писать дополнительные буковки.

Цитата Сообщение от Dark Byte Посмотреть сообщение
но количество экземпляров класса A теперь равно количеству созданных экземпляров классов A и B
Разумеется.

Суть публичного наследования: отношение "является". B - есть А.

Есть класс птиц. Мы создали 10 штук птиц.

Пингвин унаследовался от птиц.
Пингвин - тоже птица. Мы создали ещё 5 пингвинов.

Сколько всего птиц мы сделали? 15 штук.
А сколько пингвинов? 5 штук.

Если такая логика не устраивает - нужно модифицировать механизм.

Однако, на самом деле в этом не много смысла, потому что не много смысла в самом счетчике.

Такие вещи обычно используются в "специфических" задачах.

Например: тесты контейнера. по окончанию всех тестов нужно удостовериться,
что количество элементов равно нулю,
что означает, что для всех элементов были вызваны диструкторы,
что означает, что контейнер корректно все зачистил, и нет никаких утечек.

Но для таких задач сойдет простой счетчик.
Усложнять его конструкцию, а заодно - себе жизнь нет необходимости.

Цитата Сообщение от Dark Byte Посмотреть сообщение
а вот вы функции добавляете, они же тоже память какую то едят вроде? ну т.е. существуют же в памяти указатели на функции, таким образом мои ссылки жрут не больше памяти чем ваши функции !
Рассмотрим класс:

C++
1
2
3
4
5
6
7
struct Worker
{
    std::string name;
    size_t       age
   
    void work();
};
Класс содержит парочку полей и одну функцию-член.

Поля уникальны для объекта.
Различные экземпляры класса Worker могут иметь собственные значения характеристик, таких как "имя" или "возраст".

Очевидно, что единственный способ с помощью которого можно такого добиться,
это хранить в памяти объекта эти характеристики.

Теперь функция член. Она одинаковая для любых экземпляров.

Вопрос: сколько экземпляров функций будет создано, при том, что для всех экземпляров она абсолютно одинаковая?

Она будет создана в одном единственном экземпляре.
И будет жить в секции "исполняемого кода".

Более того, что из себя на самом деле представляет функция-член?

Есть обычные "свободные функции".
Функции-члены по своей природе ничем от них не отличаются.
Это тоже самые обычные функции,
просто первым аргументом они принимают адрес объекта над которым совершается действие.


Таким образом, когда вы пишите в исходном коде:

C++
1
obj.foo(param); //<--- запуск метода класса
на самом деле эта запись - лиш синтаксический сахар. Компилятор сам невидимо от программиста выполнит преобразование:

C++
1
2
foo(&obj, param); //<--- запуск свободной функции, 
    //которая первым аргументом получает объект на который воздействует
-----------------------------------------------------------------------------------------------------------
Что бы вам проще было это понять, давайте просто проиллюстрируем это на практике.

Мы создадим простенький класс. У которого сделаем метод.
И запустим этот метод не как обычный метод, а как свободную функцию.

Но прежде двигаться дальше, давайте сразу договоримся:
ниже показанный материал служит исключительно в образовательных целях,
для демонстрации принципа работы.

Однако, он не не безопасен.
И вы не должны применять это на практике без необходимости.

"Спички детям не игрушка".

-------------------------------------------------------------------
http://rextester.com/DJSUPO92322

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
#include <iostream>
using namespace std;
 
struct Example
{
    // мы можем запустить этот метод не как метод, а как обычную свободную функцию
    void foo(int) { cout<<"Example::foo(int);\n"; }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    typedef 
        void(*Free)(Example*, int);
    typedef 
        void(Example::*Method)(int);
    
    //для того, что бы запустить метод, как свободную функцию
    //нужно выполнить преобразования метода в свободную функцию
    
    Method m= &Example::foo;
    
    //для этого возьмем адрес функции-члена таким образом,
    //что бы компилятор забыл изначальный тип функции-члена
    //это позволит обойти защиту компилятора при некорректном 
    //с точки зрения компилятора преобразовании типов функции-члена к функции
    void* proxy = (void*)&m;
 
 
    //теперь извлекаем объект обратно, преобразовывая его тип к типу функции
    Free f = *((Free*)proxy);
    
    Example ex;
    
    
    //теперь, если наша теория верна, мы можем запустить функцию, 
    //передав первым аргументом тот самый "не видимый" параметр this
    //а следом все прочие аргуметы
    f(&ex,10);  
}
----------------------------------------------------------------
Надеюсь, теперь вы понимаете, что в объекте хранятся только поля, которые могут быть уникальными для экземпляров класса.

Сами же методы хранятся отдельно,
и по своей природе ничем не отличаются от обычных "свободных" функций, которые первым аргументом принимают указатель на объект.
---------------------------------------------------

Цитата Сообщение от Dark Byte Посмотреть сообщение
ну т.е. существуют же в памяти указатели на функции
Для полиморфных классов компилятор создает "невидимый" указатель на таблицу виртуальных функций.
Организовать полиморфизм по другому - просто не возможно.

Предлагаю вам прочитать очень интересную статью "полиморфизм, низкоуровневый взгляд"

http://devdoc.web-ide.ru/index... l_base.htm
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2015, 13:07
Помогаю со студенческими работами здесь

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса), а также статическую функцию, которая...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop __asm nop void main() { ...

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Инициализация объектов класса в конструкторе другого класса
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы при создании Subscriber объекты класса...

Массив объектов класса
Добрый день. При попытки создать массив объектов класса ошибка. Как в дальнейшем динамически изменять размер массива (добавлять-удалять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru