0

我写了一个程序,它都在一个文件中,方法在标题中前向声明。该程序最初在一个文件中时运行良好。但是当我分离程序时,我不断地随机出现在头文件中声明的类之一的析构函数。

我的标题中有一个静态变量来计算特定类的对象数。每当我构造对象时,我都会增加这个变量。然后在我的析构函数中,我从那个变量中减去 1,检查它是否为 0(意味着它是最后一个对象)并做一些事情。有时值似乎关闭,我不知道为什么。我的应用程序中确实有随机调用,但我不明白为什么这会影响我上面描述的内容,谢谢。任何帮助或见解表示赞赏!

[更新]:有一个基类,其中包含在头文件中实现的析构函数..,然后我有两个派生类,它们在它们的构造函数中递增静态变量.. 那我该怎么办?

我想做的是以下内容:在我的标题中,我有这个:

class A {
public:
    virtual ~A() {
        count --;
        if (count == 0) { /* this is the last one, do something */ }
    }

class B : public A {
public:
    B();
}

然后在 BI 类有

B::B() { 
    count++;
}

我在哪里可以定义计数,这样我就不会得到误导性计数?谢谢。

4

4 回答 4

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;
于 2008-12-01T04:37:34.987 回答
1

您的静态变量在哪里定义?也许您不小心在头文件中定义了它,并且内联使事情变得混乱(并且编译器没有捕获多个定义,这很奇怪,但您永远不会知道)。

确保在一个翻译单元中定义了一个类静态变量。你这样定义它:

int MyClass::static_var;

这也是你放置初始化程序的地方,如果有的话。

于 2008-12-01T03:52:10.897 回答
0

您能否详细说明“价值似乎已关闭”是什么意思?你有太多的建筑吗?破坏力不够?如果你得到了太多的构造而没有足够的破坏,那么它与静力学没有任何关系。

另外,静态变量是什么意思?您的意思是静态成员字段还是实际的静态变量?

如果您在标头中仅声明一个静态变量(我怀疑您是否这样做),那么包含该标头的每个 C 文件都将具有该变量的单独实例(因为全局变量之前的静态意味着它仅限于该对象文件)。

于 2008-12-01T03:38:43.247 回答
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 的变量,但没有为它分配任何存储空间。如果你没有把它放在源文件中,链接器会抱怨它没有找到。

于 2008-12-01T04:29:19.667 回答