我正在使用c ++创建一个Windows窗体应用程序(也许是一个愚蠢的想法?)
我有一些全局变量:
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
我想要发生的是,当应用程序加载时,线程在后台启动并加载存储的数据模型。并存储它们,以便稍后可以通过其他功能访问它们。到目前为止,其他一切工作正常,只需要能够全局存储模型。
任何人都可以建议我如何选择它吗?
答案 0 :(得分:0)
std :: vector不是托管类型。错误消息非常清楚。而不是vector
,使用托管集合类。 System::Collections::Generic::List<FrequencyDataSet>
一年中的这个时候很好,我听说过。
答案 1 :(得分:0)
FrequencyDataSet
是您正在使用的某些库使用的原生类型吗?
如果没有,请按照Seva建议的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 */
}
See here for my clr_scoped_ptr
,只要您遵守评论中的许可,您就可以使用。或者你可以研究它来学习如何自己编写。