2014-01-22 2 views
-4

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

Я попытался следующие:

myClass.h

class myClass { 
private: 
    static int internalCounter; 
    int id; 
public: 
    myClass(): id(internalCounter) {internalCounter++;} 
} 

Проблема заключается в том, что C++ не позволяет этого, и я не знаю, как обойти это. я видел подобный вопрос в SA, в котором ответ предложил нечто вроде:

myClass::internalCounter = 0; 

Но я не думаю, что это право на уровне синтаксиса.

+0

Что вы подразумеваете под «теперь разрешает это» ?! –

+0

@duffymo: Он выглядит как уникальный идентификатор для каждого объекта, а не счетчик ссылок. –

+0

Почему так много downvotes? –

ответ

2

Вы должны определить свою статическую переменную, как

int myClass::internalCounter = 0; 

в файле реализации.

2

Другое предложение, которое вы видели, было почти правильным. Вам нужно что-то вроде этого:

int myClass::internalCounter = 0; 

Но она должна идти в исходный файл в (* .cpp), а не головой. Эта строка необходима, потому что декларация сама по себе (в файле заголовка) никогда не будет создаваться иначе. Разрешение его в исходном файле означает, что оно будет собрано и создано в пределах определенной единицы перевода.

2

Вы должны определить свою статическую переменную:

int myClass::internalCounter=0; 

в файле реализации, его всегда лучше, чтобы прочитать ваш вывод компилятора/линкера, в случае г ++ это:

main.cpp:(.text.startup+0x2): undefined reference to `myClass::internalCounter' 

undefined reference средства он не был определен, это подсказка о том, что вы должны исправить в своем коде

5

C++ делает разрешает это. Но статическая переменная нуждается в определении, и похоже, что этого не хватает. Вы должны будете поместить это в исходном файле (а не заголовок)

int myClass::internalCounter = 0; 

= 0 не является обязательным, так как статические переменные равны нулю инициализирован по умолчанию, но вы можете предпочесть быть явным.

+0

Спасибо! Я приму ответ в течение нескольких минут. –

0

Я предлагаю, чтобы в любом случае вы могли поместить свой счетчик в исходный файл, вы берете его определение из класса и просто помещаете его в область анонимного пространства имен. Это требует некоторых деталей реализации вашего класса из вашего файла заголовка.

Если вы работаете в C++ 11, используйте atomic_int, а не int.

Используйте оператор post-increment, чтобы сделать действие соответствующим образом атомарным.

myClass.ч

class myClass 
{ 
    private: 
    int id; 

    public: 
    myClass(); 
    // etc 
}; 

myClass.cpp

#include <atomic> 
#include "myClass.h" 

namespace { 
    static std::atomic_int internalCounter; 
} 

myClass::myClass() 
    : id(internalCounter++) 
{ 
} 

operator++ пост-инкремент на atomic_int является, по названию, атомный, так что это будет потокобезопасной.

Смежные вопросы