Смешанное управление в C ++ - PullRequest
4 голосов
/ 15 февраля 2012

Я добавил класс в свою программу и протестировал его. Я был очень удивлен, что были какие-то реальные ошибки. Вот код:

#pragma once
#include "Iingredient.h"
#include <string>
#include <vector>

using namespace std;

ref class Recipe{
private:
    string partsName;
    vector<Iingredient> ing;
public:
    Recipe(){}

};

А вот и ошибки:

Ошибка 23, ошибка C4368: невозможно определить 'partsName' как члена управляемого «Рецепт»: смешанные типы не поддерживается c: \ users \ user \ documents \ visual studio 2010 \ projects \ smestras2_l1 \ Recipe.h 10 1 file2_L1

Ошибка 24, ошибка C4368: невозможно определить «ing» как члена управляемого «Рецепт»: смешанные типы не поддерживается c: \ users \ user \ documents \ visual studio 2010 \ projects \ smestras2_l1 \ Recipe.h 11 1 file2_L1

Я немного погуглил и обнаружил, что речь идет об управляемом и неуправляемом коде. Как это исправить? Это связано с управляемым и неуправляемым кодом или нет? если да как?

Ответы [ 4 ]

11 голосов
/ 15 февраля 2012

Я согласен с другими: вы не должны использовать C ++ / CLI в большинстве случаев, вы должны использовать C # (или другой «нормальный» управляемый язык) для этого (при условии, что вы хотите написать приложение .Net). C ++ / CLI полезен в основном при особых обстоятельствах, таких как взаимодействие между управляемым и неуправляемым кодом.

Если вы уверены, что хотите использовать C ++ / CLI, вы не можете поместить собственные классы в управляемые. Но вы можете поставить указатели на нативные классы там:

ref class Recipe{
private:
    string* partsName;
    vector<Iingredient>* ing;
};

Код выше работает. Но вы должны иметь в виду, что это обычные родные указатели C ++, и это означает, что вы должны delete вручную их использовать. Чтобы сделать это свойство, вы должны прочитать о том, как деструкторы и финализаторы работают в C ++ / CLI.

3 голосов
/ 06 декабря 2012

Нельзя использовать неуправляемые типы в управляемом классе, ключевое слово ref, поскольку куча и управляемая куча - это два разных типа памяти.Для решения этой конкретной проблемы вы можете использовать управляемый тип строки (System::String^).Морковка сообщает компилятору, что тип является дескриптором управляемого класса.

Другим способом решения этой проблемы является использование указателей, при этом указатель будет находиться в управляемой куче, а фактическая память для этого объекта будет в стандартной неуправляемой куче, где Recipeрасположен.

Чтобы построить класс Recipe, вам нужно будет сделать

Recipe^ recipe = gcnew Recipe();
3 голосов
/ 15 февраля 2012

Определяя ref class Recipe, вы сделали это удалось .Но std::string и std::vector являются неуправляемыми типами.Вы пытаетесь объявить собственные переменные в управляемом классе, но это не разрешено.

Кажется, вы новичок в C ++.Просто не используйте C ++ / CLI.Рассмотрим C #, если вы нацелены на .Net или неуправляемый C ++.

1 голос
/ 15 февраля 2012

Не имея представления о c ++ - cli, я могу попытаться догадаться, что проблема в том, что вы определяете ссылочный тип и пытаетесь использовать типы C ++ внутри (поле std::string), а не эквивалентный управляемый тип ( String?).

Причина, по которой это может быть проблематичным, заключается в том, что в нем сочетаются подходы к управлению ресурсами. Ссылочные типы предназначены для использования вне сборщика мусора, и если вы не внедрите деструктор или IDisposable, они будут просто проигнорированы, как только будет доказано, что последняя ссылка потеряна. С другой стороны, чтобы иметь возможность управлять памятью во внутреннем поле, должен быть вызван деструктор std::string.

...