计算创建的类对象

时间:2016-03-16 19:35:28

标签: c++ oop

我猜这个问题不需要任何解释。我真的不知道自己做错了什么。我之前做过一次,它运作正常。我现在还是初学者。

#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

我可能犯了一些愚蠢的错误

编辑:我担心它违反规则,但我有下一个问题与前一个相关。我粘贴了必须显示问题的最小代码。现在,当我尝试将解决方案应用到我的主代码中时,我收到错误'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_employeeEmployee类型函数。如果你需要更多细节,我会问一个新问题。

3 个答案:

答案 0 :(得分:4)

添加:

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

它应该没问题

答案 1 :(得分:1)

您缺少计算使用默认编译器生成的复制/移动构造函数创建的实例。如果您创建用户定义的版本,则应平衡计数:

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

Live Demo

答案 2 :(得分: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)中抵消所有破坏。