Visual c++ 在Visual c+中作为全局变量的std::vector+; 我用C++(也许是愚蠢的想法)制作Windows窗体应用程序

Visual c++ 在Visual c+中作为全局变量的std::vector+; 我用C++(也许是愚蠢的想法)制作Windows窗体应用程序,visual-c++,vector,global-variables,stdvector,Visual C++,Vector,Global Variables,Stdvector,我有几个全局变量: private: System::Windows::Forms::OpenFileDialog^ openFileDialog; private: System::Windows::Forms::ListBox^ outputListBox; private: bool done; private: array<String^>^ filesList; private: vector< FrequencyDataSet > storedModels

我有几个全局变量:

private: System::Windows::Forms::OpenFileDialog^  openFileDialog;
private: System::Windows::Forms::ListBox^  outputListBox;
private: bool done;
private: array<String^>^ filesList;
private: vector< FrequencyDataSet > storedModels; 
我希望发生的是,当应用程序加载时,一个线程在后台启动,并加载到存储的数据模型中。并存储它们,以便以后其他功能可以访问它们。到目前为止,其他一切都运行良好,只需要能够在全球范围内存储模型


有人能给我建议一种替代方法吗?

std::vector不是托管类型。错误信息非常清楚。使用托管集合类而不是
vector
<我听说,一年中的这个时候代码>系统::集合::通用::列表很不错。

你正在使用的某个库是否使用了
频率数据集
本机类型

如果没有,那么按照Seva的建议使用
System::Collections::Generic::List stored模型

如果是,则需要一个本机集合来管理本机类型,
std::vector
是一个不错的选择。但是
std::vector
不能直接放在
表单中,因为.NET垃圾收集器将移动
表单的
实例以压缩内存。所以你需要把向量放在它不会移动的地方。一个选项是实际全局变量:

在头文件中:

extern std::vector<FrequencyDataSet> g_storedModels;
但是这个向量不是由垃圾收集器管理的,现在您需要记住在
表单
被销毁时释放它。智能指针将对此有所帮助

clr_scoped_ptr<std::vector<FrequencyDataSet>> storedModels;
MyForm() : storedModels(new std::vector<FrequencyDataSet>())
{
    /* the rest of your constructor... InitializeComponents and so forth */
}
clr\u范围的ptr存储模型;
MyForm():storedModels(新std::vector())
{
/*构造函数的其余部分…初始化组件等等*/
}

,只要您遵守评论中的许可证,就可以使用。或者你可以学习它来学习如何编写你自己的。

这些不是全局变量,它们是类成员。
std::vector
类型的全局变量工作正常。指向
std::vector
的指针类型的类成员也是如此(但一定要使用智能指针并节省内存管理时间)。我是如何做到这一点的?我对这个全新C++ C++和C++更感兴趣。如果你是C++新手,为什么要使用C++?如果您想使用.NET和VisualStudioForms Designer,C#会容易得多。如果你想学习C++,请远离C++ +CLI,直到你先学习标准C++。C++和CLI是为知道C语言和C++的人设计的,他们有一个C++库,他们想在WiFrm应用程序中使用。@ USE808359和Visual C++看起来更复杂。这是因为你不使用C++,而是C++ + CLI,它基本上是C++ .NET,是完全不同于标准C++的语言。我从一个基于CONSOL的应用开始,但是需要一个GUI,并且是重新组合的Windows窗体。从不喜欢.NET,但这似乎是让GUI快速运行的最简单方法。。。显然我错了。有谁能推荐一种替代方法来轻松创建一个简单的GUI吗?但他不想要字符串集合。我尝试了:
private:System.Collections.Generic.List^storedModels但是我得到了错误:
错误1错误C2143:语法错误:缺少“;”“.”之前
错误2错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/COME和<代码>错误3错误C223:在'';'/'之前的意外令牌(S)代码>再次抱歉,C#习惯妨碍了你。在C++中,命名空间的解析是通过::我尝试过,但是我只是得到这个错误:“错误2错误240:”初始化:“不能运行从‘STD::vector *'到‘频率数据集’”当我运行这个:<代码> FuffCyDeDATA FrqStE= SturdMeod(0);code>@user808359:Try
FrequencyDataSet freqSet=(*storedModels)[0]
std::vector<FrequencyDataSet> g_storedModels;
std::vector<FrequencyDataSet>* storedModels;
MyForm() : storedModels(new std::vector<FrequencyDataSet>())
{
    /* the rest of your constructor... InitializeComponents and so forth */
}
clr_scoped_ptr<std::vector<FrequencyDataSet>> storedModels;
MyForm() : storedModels(new std::vector<FrequencyDataSet>())
{
    /* the rest of your constructor... InitializeComponents and so forth */
}