2013-05-10 78 views
2

請看看下面的頭文件混合型,不支持

#pragma once 
using namespace UsbLibrary; 

ref class MissileLauncher 
{ 
public: 
    MissileLauncher(void); 

private: 
    //Bytes used in command 
    unsigned char UP[10]; 
    unsigned char RIGHT[10]; 
    unsigned char LEFT[10]; 
    unsigned char DOWN[10]; 

    unsigned char FIRE[10]; 
    unsigned char STOP[10]; 
    unsigned char LED_OFF[9]; 
    unsigned char LED_ON[9]; 

    UsbHidPort USB; 
}; 

我使用的是Visual C++項目(C++/CLI?)在Visual Studio專業2010年當我運行這段代碼,我得到很多錯誤

Error 1 error C4368: cannot define 'UP' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 2 error C4368: cannot define 'RIGHT' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 3 error C4368: cannot define 'LEFT' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 4 error C4368: cannot define 'DOWN' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 5 error C4368: cannot define 'FIRE' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 6 error C4368: cannot define 'STOP' as a member of managed 'MissileLauncher': mixed types are not supported 
Error 7 error C4368: cannot define 'LED_OFF' as a member of managed 'MissileLauncher': mixed types are not supported  
Error 8 error C4368: cannot define 'LED_ON' as a member of managed 'MissileLauncher': mixed types are not supported 

在這裏,命名空間USBLibrary來自C#的dll文件。該UsbHidPort;是從C#DLL

那麼,爲什麼我收到此錯誤的對象?有任何想法嗎?

+0

我建議閱讀[本文檔](http://blogs.msdn.com/b/branbray/archive/2005 /07/20/441099.aspx),其中討論了原生類型,管理類型,以及何時/如何/如果一個可以容納其他的,在長度這麼做。這是一個有點過時,但它的癥結會告訴你,你有,爲什麼你有它的問題,事情可以做了。 – WhozCraig 2013-05-10 20:27:10

回答

6

這實際上不是這種特定情況下的一個問題,至少從什麼是可見的,但C++/CLI編譯器試圖阻止你拍攝你的腿了,導彈的風格。垃圾收集器在壓縮堆時移動對象。這使得本地對象非常危險,任何指向它們的指針都將變爲無效,並在通過它們寫入時破壞GC堆。收集器無法更新這些指針,它無法找到它們。風險太高,所以編譯器只是禁止它。

一種替代方法是這些構件作爲指針代替聲明並分配與在類的構造操作者新的陣列。

private: 
    unsigned char* UP; 
    // etc.. 
public: 
    MissileLauncher() { 
     UP = new unsigned char[10]; 
     // etc.. 
    } 
    ~MissileLauncher() { 
     this->!MissileLauncher(); 
     UP = nullptr; // Destructor may be called more than once 
    } 
    !MissileLauncher() { 
     delete[] UP; 
     // etc... 
    } 

請注意需要析構函數和終結器來釋放這些數組的內存。定義析構函數還帶來了客戶端程序員必須調用它的負擔(Dispose()或在C#客戶端程序中使用,在C++/CLI程序中刪除或堆棧語義),跳過這樣一個小的分配不是不合理的。最後但並非最不重要的是,考慮理性解決方案並使用託管陣列:

private: 
    array<Byte>^ UP; 
    // etc.. 
public: 
    MissileLauncher() { 
     UP = gcnew array<Byte>(10); 
     // etc.. 
    } 
+0

太棒了!沒有話要謝謝你! – Soldier 2013-05-11 05:11:52

1

的問題是你混合託管和非託管類型是什麼編譯器警告的手段。該類是一個託管類,但整數數組計爲非託管對象。這會導致垃圾收集問題。閱讀所有關於它在這裏:

http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx

爲什麼不使用管理的陣列?

+0

感謝您的回覆。我並不喜歡這種被管理的東西。你能不能告訴我如何創建一個託管數組? – Soldier 2013-05-10 20:34:22

+0

沒問題。如果你有一個閱讀http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types這基本上解釋了所有的價值/參考類型和相應的語法。 int數組是Hans Passant描述的一系列值類型的聲明和分配。 – OOhay 2013-05-11 09:11:03