2009-08-17 44 views
2

我無法初始化託管類中的靜態本地指針。如何在C++/CLI代碼中初始化非託管靜態指針?

下面是詳細信息:我創建了一個C++/CLI控制檯項目,並在其中聲明瞭一個靜態非託管指針。不過,我無法用任何方法初始化靜態指針(但是如果我將指針放入匿名名稱空間中,沒有問題,請在代碼中演示)。你有沒有遇到過類似的情況併爲它提供解決方案?

代碼在這裏:

class MyTask 
{ 
public: 
    int m_index; 
    MyTask() 
    { 
     m_index = 0; 
    } 
}; 

namespace 
{ 
    static MyTask* s_pTask; 
} 

public ref class MyApplication 
{ 
public: 
    static MyTask* sm_pTask; 

    static void InitizlizeStaticMembers(MyTask* pTask) 
    { 
     sm_pTask = pTask; 
    } 

    void AddTask() 
    { 
     sm_pTask = new MyTask(); 
    } 
}; 

void main() 
{ 
    MyApplication^ app = gcnew MyApplication(); 

    // 1st, doesn't work (sm_pTask is still null after the execution) 
    MyApplication::sm_pTask = new MyTask(); 
    // 2nd, doesn't work (pTask can be initialized correctly, sm_pTask is still null after the execution) 
    MyTask* pTask = new MyTask(); 
    MyApplication::InitizlizeStaticMembers(pTask); 
    // 3rd, doesn't work (sm_pTask is still null after the execution) 
    app->AddTask(); 
    // 4th, work(s_pTask can be initialized correctly) 
    s_pTask = new MyTask(); 
} 

回答

2

我發現(與VS2005)調試證實你所說的 - 因爲它獲取更新的指針的值不會改變。但是如果你輸出一些東西的話,代碼實際上還在工作。

我相信這是調試器中的一個錯誤。

+2

VS2008似乎有同樣的問題,但它似乎在VS2010 Beta中得到糾正。 我確認當您打印值是否與std :: cout本地方法或System :: Console :: WriteLine()託管方法,此代碼似乎行爲正確。 – cedrou 2009-08-17 06:11:02

0

我看不出任何問題的代碼,它爲我工作得很好。匿名命名空間不是必需的。

#include "stdafx.h" 
#include <iostream> 

class MyTask 
{ 
public: 
    int m_index; 
    MyTask() 
    { 
     m_index = 0; 
    } 
}; 

static MyTask* s_pTask; 

public ref class MyApplication 
{ 
public: 
    static MyTask* sm_pTask = NULL; 

    static void InitizlizeStaticMembers(MyTask* pTask) 
    { 
     sm_pTask = pTask; 
    } 

    void AddTask() 
    { 
     sm_pTask = new MyTask(); 
    } 
}; 

void main() 
{ 
    MyApplication^ app = gcnew MyApplication(); 

    // 1st, doesn't work (sm_pTask is still null after the execution) 
    std::cout << "MyApplication::sm_pTask before new " << MyApplication::sm_pTask << '\n'; // 0 
    MyApplication::sm_pTask = new MyTask(); 
    std::cout << "MyApplication::sm_pTask after new " << MyApplication::sm_pTask << '\n'; // 003B8170 

    MyTask* pTask = new MyTask(); 
    std::cout << "pTask= " << pTask << '\n'; // 003B81A0 
    MyApplication::InitizlizeStaticMembers(pTask); 
    std::cout << "MyApplication::sm_pTask = " << MyApplication::sm_pTask << '\n'; // 003B81A0 

    app->AddTask();  
    s_pTask = new MyTask(); 
}