std::vector作为Visual c++中的全局变量



我正在使用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,只要您遵守评论中的许可证,您就可以使用它。或者你可以学习它来学习如何写自己的文章。

相关内容

  • 没有找到相关文章