2016-03-16 6 views
2

Вопрос не требует никаких объяснений, я думаю. Я действительно не знаю, что я делаю неправильно. Я сделал это раньше, и он работал нормально. Я все еще новичок.Подсчет созданных объектов класса

#include <iostream> 
#include <vector> 

class Employee 
{ 
private: 
    static int counter; 
public: 
    Employee::Employee() 
    { 
     counter++; 
    } 

    Employee::~Employee() 
    { 
     counter--; 
    } 

    static int ShowCounter() 
    { 
     //std::cout << counter << std::endl; 
     return counter; 
    } 
}; 

int Employee::counter = 0; 

int main() 
{ 
    std::vector<Employee> employees; 

    std::cout << "Constructors: " << std::endl; 
    employees.push_back(Employee()); 
    std::cout << Employee::ShowCounter() << std::endl; 
    employees.push_back(Employee()); 
    std::cout << Employee::ShowCounter() << std::endl; 
    employees.push_back(Employee()); 
    std::cout << Employee::ShowCounter() << std::endl; 

    std::cout << "Destructors: " << std::endl; 
    employees.pop_back(); 
    std::cout << Employee::ShowCounter() << std::endl; 
    employees.pop_back(); 
    std::cout << Employee::ShowCounter() << std::endl; 
    employees.pop_back(); 
    std::cout << Employee::ShowCounter() << std::endl; 

    std::cout << std::endl; 

    system("pause"); 
} 

Выход:

Constructors: 
0 
-1 
-3 
Destructors: 
-4 
-5 
-6 

я, вероятно, сделал какой-то глупая ошибка

EDIT: Я боюсь, что это против правил, но у меня есть следующий вопрос, связанный с предыдущим. Я вставил минимальный код, который должен был показать мою проблему. Теперь, когда я пытаюсь реализовать свое решение в своем основном коде, я получаю ошибку 'Employee &Employee::operator =(const Employee &)': attempting to reference a deleted function'. Линия с вопросом:

employees[employees.size() - 1] = generate_random_employee(employees[employees.size() - 1], employees); 

Функция generate_random_employee является Employee функция типа. Если вам нужно больше деталей, я задам новый вопрос.

+3

Вы не считаете экземпляры, созданные из конструкторов копирования. –

ответ

4

Добавить:

Employee(const Employee&) 
{ 
    counter++; 
} 
Employee(Employee&&) 
{ 
    counter++; 
} 

и она должна быть тонкой

+0

К сожалению, решение не работает. Или я не знаю, как его использовать. Теперь я получаю 'Ошибка: никакой экземпляр конструктора" Employee: Employee "не соответствует списку аргументов' – mathsicist

+0

@mathsicist' Employee: Employee', безусловно, неверен, вам нужно '::', см. Здесь: https: // ideone. com/17TnWN – marcinj

+0

ОК, у меня это есть. Спасибо. Не могли бы вы посмотреть отредактированный вопрос? – mathsicist

1

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

Employee::Employee(Employee&& rhs) // : Whatever needs to be copied/moved 
{ 
    counter++; 
} 

Live Demo

1

Вы забыли обрабатывать копии. Каждый раз, когда вы вставляете элемент в вектор, создается копия. Так

employees.push_back(Employee()); 

Вызывает конструктор, делает копию, а затем Employee() разрушается, который оставляет вас с сетью 0. К сожалению, большинство пустых векторов начинаются с 0 мощности, поэтому второй вызов push_back будет нужно расти массив. Когда это происходит, у вас есть одна копия и одно уничтожение. Это мое вы видите -1 после следующей вставки. Затем мы снова вырастием вектор, так что теперь у нас есть 2 копии и 2 вызова деструктора, поэтому мы переходим от -1 до -3. Затем, когда вы опустошите вектор, у вас есть один вызов деструктора для каждого элемента, и поскольку у нас есть 3 элемента, мы переходим от -3 до -6. Если мы добавим конструктор копирования, как

Employee(const Employee& rhs) 
{ 
    counter++; 
} 

Тогда мы компенсировано все разрушения от копий (Live Example).

+0

Хорошо, теперь я понимаю, как это работает. Вопросы - вот почему 'const Employee & rhs'. Что это значит? Может быть, какая-то ссылка? – mathsicist

+0

@mathsicist. Как вы определяете [конструктор копирования] (http://en.cppreference.com/w/cpp/language/copy_constructor) – NathanOliver

+0

Я хотел бы убедиться: все, о чем вы описали, как 'v.push_back (T()) 'работает, не так ли? Если я буду использовать другой контейнер или просто создать новый объект 'T obj', он будет работать нормально, не создавая никаких копий? Правильно ли я думаю? – mathsicist

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