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

时间:2012-01-27 15:12:08

标签: visual-c++ vector global-variables stdvector

我正在使用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

我想要发生的是,当应用程序加载时,线程在后台启动并加载存储的数据模型。并存储它们,以便稍后可以通过其他功能访问它们。到目前为止,其他一切工作正常,只需要能够全局存储模型。

任何人都可以建议我如何选择它吗?

2 个答案:

答案 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,只要您遵守评论中的许可,您就可以使用。或者你可以研究它来学习如何自己编写。