我猜这个问题不需要任何解释。我真的不知道自己做错了什么。我之前做过一次,它运作正常。我现在还是初学者。
#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_employee
是Employee
类型函数。如果你需要更多细节,我会问一个新问题。
答案 0 :(得分:4)
添加:
Employee(const Employee&)
{
counter++;
}
Employee( Employee&&)
{
counter++;
}
它应该没问题
答案 1 :(得分:1)
您缺少计算使用默认编译器生成的复制/移动构造函数创建的实例。如果您创建用户定义的版本,则应平衡计数:
Employee::Employee(Employee&& rhs) // : Whatever needs to be copied/moved
{
counter++;
}
答案 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)中抵消所有破坏。