C++ 静态变量,单独编译

C++ 静态变量,单独编译,c++,file,variables,static,C++,File,Variables,Static,我写了一个程序,全部放在一个文件中,方法在头文件中被向前声明。该程序最初在一个文件中运行时效果良好。但是当我分离程序时,我不断得到头文件中声明的一个类的析构函数的随机出现 我的头中有一个静态变量,用于计算特定类的对象数。每当我构造对象时,我都会增加这个变量。然后在我的析构函数中,我从变量中减去1,检查它是否为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();
}
那么在B班我有

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

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

你能详细解释一下你所说的“值似乎不正确”是什么意思吗?你有太多的建筑吗?破坏不够?若你们有太多的构造,并没有足够的破坏,这和静力学并没有任何关系

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


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

静态变量是在哪里定义的?也许您无意中在头文件中定义了它,而内联使事情变得混乱,编译器也无法捕获多个定义,这很奇怪,但您永远也不知道

确保在一个转换单元中定义了类静态变量。您可以这样定义它:

int MyClass::static_var;
这也是放置初始值设定项(如果有)的地方

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的变量,但没有为它分配任何存储。如果没有将其放入源文件中,链接器会抱怨找不到它。

必须在“所有”中定义构造函数以增加计数

注意:除非您定义它们,否则编译器将自动生成以下四种方法:

如果未定义其他构造函数,则为默认构造函数 默认析构函数 复制构造函数 赋值运算符 下面的代码覆盖编译器默认值,以便获得准确的计数

 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;

我的头中确实有静态变量,因为我的析构函数是在头中定义的,并且它使用该变量,所以我还能把它放在哪里呢?谢谢。@BobS,静态变量是类的一部分,还是在类的块之外?你可能想把它放在你的课堂上。另外,您需要在一个.cpp文件中定义它,以便将其导出一次。。这是在头中实现的,然后我有两个派生类,它们在构造函数中递增静态变量。。那么我能做什么呢?@BobS,请将你的代码或相关部分粘贴到你的原始问题中,这样我们就可以清楚地看到你在做什么。谢谢。@Bobs,我是第二个strager,你能发布代码吗,或者至少发布这个类的代码?我们试图确定您的static是作为成员还是作为全局变量编写的。这些C++中有不同的语义,正如我的答案所示。嗨,在我的头中,我有一个析构函数,需要调用StasyVar。但是我需要在我的构造函数中调用STATICHYVAR,用于我的两个派生类,那么我可以把这一行放在哪里呢?它有时不能加起来的原因是因为编译器会自动为您生成复制构造函数。默认复制构造函数不会增加count变量。