为什么这样写就是编译通不过啊???stest.h
class stest
{
public:
    stest();
    ~stest() {}   static int m_nRef;
   static vector<int>  intarr;
};stest.cppint stest::m_nRef = 0;
stest::~stest()
{
   if(--m_nRef == 0)
       intarr.clear();
}
我把析构函数里的内容清空 就可以编译通过了(只要不在 cpp中用到 intarr 就可以编译通过)这是怎么回事啊???高手指教啊!!!

解决方案 »

  1.   

    包含定义vector的头文件。
    在cpp里最前面加上:
    vector<int> stest::intarr;
      

  2.   

    把编译错误给出来先吧
    不过应该是静态变量只能在静态方法中能够用的
    java中是这样的
      

  3.   

    静态变量在全局空间分配,只有在堆中由new创建的才需析构
      

  4.   

    &#1048708; 
    對於全域物件(如本例之GlobalObject),程式&#12690;開始,其建構式就先被執行
    (比程式進入點更早);程式即將結束前其解構式被執行。MFC 程式就有這
    樣&#12690;個全域物件,通常以 application object 稱呼之,你將在第6章看到它。
    &#1048708; 對於區域物件,當物件誕生時,其建構式被執行;當程式流程將離開該物件的
    存活範圍(以至於物件將毀滅),其解構式被執行。
    &#1048708; 對於靜態(static)物件,當物件誕生時其建構式被執行;當程式將結束時(此
    物件因而將遭致毀滅)其解構式才被執行,但比全域物件的解構式早&#12690;步執
    行。
    &#1048708; 對於以 new 方式產生出來的區域物件,當物件誕生時其建構式被執行。解構
    式則在物件被delete 時執行
    ///以上是MFC深入浅出里的 第2章 C++ 的重要性質  生存期问题
      

  5.   

    我的結論是:
    &#1048708; 對於全域物件(如本例之GlobalObject),程式&#12690;開始,其建構式就先被執行
    (比程式進入點更早);程式即將結束前其解構式被執行。MFC 程式就有這
    樣&#12690;個全域物件,通常以 application object 稱呼之,你將在第6章看到它。
    &#1048708; 對於區域物件,當物件誕生時,其建構式被執行;當程式流程將離開該物件的
    存活範圍(以至於物件將毀滅),其解構式被執行。
    &#1048708; 對於靜態(static)物件,當物件誕生時其建構式被執行;當程式將結束時(此
    物件因而將遭致毀滅)其解構式才被執行,但比全域物件的解構式早&#12690;步執
    行。
    &#1048708; 對於以 new 方式產生出來的區域物件,當物件誕生時其建構式被執行。解構
    式則在物件被delete 時執行(&#12694;例程式未示範)。
    //以上是MFC 深入浅出中的话~
      

  6.   

    1. stest的析构函数实现了两次;
    2. 静态变量intarr只有声明没有定义,应该加上.
    ...
    int stest::m_nRef = 0;
    vector<int> stest::intarr;
    ...