我正在使用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
我想做的是,当应用程序加载时,一个线程在后台启动,并加载存储的数据模型。并存储它们,以便在稍后阶段可以由其他功能访问它们。到目前为止,其他一切都很好,只需要能够在全球范围内存储模型。
有人能给我一个替代方案吗?
std::vector不是托管类型。错误信息非常清楚。使用托管集合类而不是vector
。听说System::Collections::Generic::List<FrequencyDataSet>
每年这个时候都很不错。
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;
但是,如果Form或其他类的每个实例都需要一个副本,则需要使用本地堆的动态分配(不会移动)并保留一个指针。这将起作用(在您的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
,只要您遵守评论中的许可证,您就可以使用它。或者你可以学习它来学习如何写自己的文章。