std :: vector как глобальная переменная в Visual c ++ - PullRequest
1 голос
/ 27 января 2012

Я делаю приложение для Windows Form, используя c ++ (возможно, глупая идея?)

и у меня есть несколько глобальных переменных:

private: System::Windows::Forms::OpenFileDialog^  openFileDialog;
private: System::Windows::Forms::ListBox^  outputListBox;
private: bool done;
private: array<String^>^ filesList;
private: vector< FrequencyDataSet > storedModels; 

однако, когда я компилирую его, он говорит:

Error   1   error C4368: cannot define 'storedModels' as a member of managed 'Project::Form1': mixed types are not supported

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

Кто-нибудь может предложить альтернативу тому, как я это делаю?

Ответы [ 2 ]

0 голосов
/ 27 января 2012

Является ли FrequencyDataSet нативным типом, используемым какой-то библиотекой, которую вы используете?

Если нет, то укажите System::Collections::Generic::List<FrequencyDataSet> storedModels, как предложил Сева.

Если это так,нужна нативная коллекция для управления вашими нативными типами, и std::vector - хороший выбор.Но std::vector не может быть непосредственно внутри вашего Form, поскольку сборщик мусора .NET переместит ваши экземпляры Form в компактную память.Поэтому вам нужно поместить вектор туда, где он не будет двигаться.Одним из вариантов является настоящая глобальная переменная:

В вашем заголовочном файле:

extern std::vector<FrequencyDataSet> g_storedModels;

и в одном файле .cpp:

std::vector<FrequencyDataSet> g_storedModels;

Однако, если вам это нужноСкопируйте для каждого экземпляра вашей формы или другого класса, вам нужно использовать динамическое выделение из собственной кучи (которая не будет перемещаться) и сохранить указатель.Это будет работать (внутри вашего ref class MyForm или как вы его называете):

std::vector<FrequencyDataSet>* storedModels;
MyForm() : storedModels(new std::vector<FrequencyDataSet>())
{
    /* the rest of your constructor... InitializeComponents and so forth */
}

Но этот вектор не управляется сборщиком мусора, теперь вам нужно помнить, чтобы освободить его, когда ваш Form уничтожено.Умный указатель поможет с этим.

clr_scoped_ptr<std::vector<FrequencyDataSet>> storedModels;
MyForm() : storedModels(new std::vector<FrequencyDataSet>())
{
    /* the rest of your constructor... InitializeComponents and so forth */
}

Смотрите здесь для моего clr_scoped_ptr, который вы можете использовать, если вы будете соблюдать лицензию в комментариях.Или вы можете изучить его, чтобы научиться писать самостоятельно.

0 голосов
/ 27 января 2012

std :: vector не является управляемым типом. Сообщение об ошибке довольно ясно. Вместо vector используйте класс управляемой коллекции. System::Collections::Generic::List<FrequencyDataSet> приятно в это время года, я слышал.

...