2008-12-01 56 views
0

我编写了一个程序,全部在一个文件中,并且这些方法在头文件中进行了前向声明。该程序最初在一个文件中完美工作。但是,当我分开程序时,我一直在头文件中声明的某个类的析构函数中随机出现。静态变量,单独编译

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

然后在此类BI有

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

我在哪里可以定义计算,所以我不得到误导的数字?谢谢。

+0

,它有时不加起来是因为编译器自动生成你的拷贝构造函数的原因。默认的拷贝构造函数不会增加count变量。 – 2008-12-01 04:42:09

回答

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); 

你需要这样做,因为头文件中声明,有将是一个变量命名计数,但没有分配任何存储它。如果你没有把它放在源文件中,链接器会抱怨找不到它。

0

你能详细说明你的意思是“价值似乎没有了”吗?你有太多的建筑吗?没有足够的破坏?如果你得到的结构太多而且没有足够的破坏,那么与静力学无关。

另外,你是什么意思的静态变量?你是指静态成员字段还是实际的静态变量?如果你在头文件中声明了一个静态变量(我怀疑你是这样做的),那么包含该头文件的每个C文件都将拥有该变量的单独实例(因为静态在全局变量之前意味着它是限于该目标文件)。

+0

我在头文件里有静态变量,我还可以放在哪里,因为我的析构函数是在头文件中定义的,并且它使用了该变量,谢谢。 – BobS 2008-12-01 03:44:50

+0

@BobS,是类的静态变量的一部分,还是在类的块之外?你可能想在你的班级里面。另外,你需要在一个.cpp文件中定义(?)它,这样它会被导出一次。 – strager 2008-12-01 03:58:41

+0

我有一个基类,其中包含析构函数..它在头中实现,然后我有两个派生类,它们在它们的构造函数中增加静态var ..所以我能做什么? – BobS 2008-12-01 04:00:21

1

你的静态变量在哪里定义?也许你意外地在头文件中定义了它,并且内联是令人困惑的事情(并且编译器没有捕获多个定义,这很奇怪,但你永远不知道)。

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

int MyClass::static_var; 

这也是放置初始值设定项的地方,如果有的话。

6

您必须在A中定义构造函数(所有这些函数)以增加计数。

注意,除非你确定它们的编译器自动生成以下四种方法:

  • 默认构造函数(如果没有其他构造函数定义)
  • 缺省析构函数
  • 拷贝构造函数
  • 赋值运算符

以下代码覆盖了编译器的默认值,以便y你应该得到一个准确的数字。

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;