2013-05-10 5 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?) В визуальной студии профессиональный 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), в котором обсуждаются собственные типы, управляемые типизированные и когда/how /, если один может удерживать другой, делая это по длине. Он немного устарел, но суть его покажет вам проблему, с которой вы сталкиваетесь, почему у вас это есть, и все, что вы можете с этим поделать. – WhozCraig

ответ

6

На самом деле это не проблема в этом конкретном случае, по крайней мере, из того, что видно, но компилятор C++/CLI пытается помешать вам снять ногу с ракеты. Сборщик мусора перемещает объекты, когда он уплотняет кучу. Это делает опасные объекты, но любые указатели на них становятся недействительными и уничтожают кучу GC при их записи. Коллекционер бессилен обновлять эти указатели, он не может их найти. Риск слишком высок, поэтому компилятор просто запрещает его.

Альтернативой является объявление этих элементов в качестве указателей вместо этого и выделение массива с помощью оператора new в конструкторе класса.

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

1

Проблема заключается в том, что вы смешиваете управляемые и неуправляемые типы, что означает предупреждение компилятора. Класс является управляемым классом, но целые массивы считаются неуправляемыми объектами. Это вызывает проблемы с сборкой мусора. Читайте об этом здесь:

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

Почему бы не использовать управляемые массивы?

+0

Спасибо за ответ. Я не знаком с этой управляемой вещью. Можете ли вы быть любезны, чтобы рассказать мне, как создать управляемый массив? – Soldier

+0

Нет проблем. Если вы читаете http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types, это в основном объясняет, что происходит со всеми типами значений/ссылок и соответствующий синтаксис. Массив ints представляет собой массив типов значений, объявленных и распределенных по описанию Hans Passant. – OOhay

Смежные вопросы