静态变量,单独编译

时间:2008-12-01 03:32:44

标签: c++ file variables static

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

我的标题中有一个静态变量来计算特定类的对象数。每当我构造对象时,我都会增加此变量。然后在我的析构函数中,我从该变量中减去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++;
}

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

4 个答案:

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