我写了一个程序,它都在一个文件中,并且方法在标题中向前声明。该程序最初在一个文件中完美运行。但是当我分离程序时,我不断发现在头文件中声明的类之一的析构函数。
我的标题中有一个静态变量来计算特定类的对象数。每当我构造对象时,我都会增加此变量。然后在我的析构函数中,我从该变量中减去1,检查它是否为0(意味着它是最后一个对象)并执行某些操作。价值似乎有时会消失,我不知道为什么。我的应用程序中有随机调用,但我不明白为什么会影响我上面描述的内容,谢谢。感谢任何帮助或见解!
[更新]:有一个基类,它包含析构函数..它在头文件中实现,然后我有两个派生类,它们在构造函数中递增静态var ..所以我该怎么办?
我要做的是以下内容:在我的标题中,我有这个:
class A {
public:
virtual ~A() {
count --;
if (count == 0) { /* this is the last one, do something */ }
}
class B : public A {
public:
B();
}
然后在B组我有
B::B() {
count++;
}
我在哪里可以定义计数,这样我就不会产生误导性的计数?感谢。
答案 0 :(得分:6)
您必须在A(所有这些)中定义构造函数以增加计数。
注意除非您定义它们,否则编译器会自动生成以下四种方法:
以下代码会覆盖编译器默认值,以便您获得准确的计数。
class A
{
static int count;
public:
A() // Default constructor.
{
++count;
}
A(A const& copy) // Copy constructor/
{ // Note If you do not define it the compiler
++count; // will automatically do it for you
}
virtual ~A()
{
--count;
if (count == 0)
{ // PLOP
}
}
// A& operator=(A const& copy)
// do not need to override this as object has
// already been created and accounted for.
};
//// 在源文件中:
int A::count = 0;
答案 1 :(得分:1)
您的静态变量在哪里定义?也许你不小心在头文件中定义它,并且内联是令人困惑的东西(并且编译器没有捕获多个定义,这将是奇怪的,但你永远不知道)。
确保在一个翻译单元中定义一个类静态变量。你可以这样定义:
int MyClass::static_var;
这也是你放置初始化程序的地方(如果有的话)。
答案 2 :(得分:0)
你能详细说明“价值似乎已经过去”的含义吗?你有太多的建筑吗?没有足够的破坏?如果你得到太多的结构而没有足够的破坏,它就不会与静力学有任何关系。
另外,静态变量是什么意思?你的意思是静态成员字段还是实际的静态变量?
如果你在标题中声明一个静态变量(我怀疑你这样做),那么包含该标题的每个C文件都会有一个单独的变量实例(因为在全局变量之前静态意味着它是有限的到该目标文件)。
答案 3 :(得分:0)
class A {
public:
virtual ~A() {
count --;
if (count == 0) { // this is the last one, do something }
}
protected:
static int count;
};
class B : public A{
public:
B();
};
然后,在一个且只有一个源文件中,您需要输入以下内容。它应该放在包含A类代码的源文件中。
int A::count(0);
你需要这样做,因为头文件声明会有一个名为count的变量,但没有为它分配任何存储空间。如果您没有将它放在源文件中,链接器会抱怨找不到它。