我使用全局类来设置其中的一些信息。我想填写这个班级的清单。
我正在尝试这个:
#pragma once
#include "Element.h"
#include "PLCconnection.h"
ref class ManagedGlobals {
public:
static List<Element^>^ G_elementList; //wordt gedefineerd in ReadPlotFile.cpp
static System::String^ G_plotFileName; //wordt gedefineerd in PlotFileForm.h
static System::String^ G_Language; //wordt gedefineerd in MainForm.h
static PLCconnection^ G_PLCverbinding = gcnew PLCconnection();
static bool G_plcOnline = G_PLCverbinding->ConnectToPLC();
static List<System::String^>^ G_VariableList = gcnew List<System::String^>;
//static List<System::String^>^ G_VariableList = gcnew List <System::String^>;
G_VariableList = G_PLCverbinding->LeesTest2(); // this line gives the error
};
我得到的错误:this declaration has no storage class or type specifier
我该如何解决这个问题?我在项目的多个地方使用这个列表,所以我需要它是全局的。
答案 0 :(得分:0)
您必须在单个表达式中声明G_VariableList
成员,如下所示:
static List<System::String^>^ G_VariableList = G_PLCverbinding->LeesTest2();
如果G_PLCverbinding
仅用于初始化静态成员,我个人会使用static constructor代替:
ref class ManagedGlobals {
static ManagedGlobals()
{
PLCconnection^ plcVerbinding = gcnew PLCconnection();
G_plcOnline = plcVerbinding->ConnectToPLC();
G_VariableList = plcVerbinding->LeesTest2();
}
public:
static bool G_plcOnline;
static List<System::String^>^ G_VariableList;
};
请记住,从静态构造函数中抛出的任何异常,或者作为第一个示例中的“内联”静态初始化的一部分,都会导致您的类型无法使用,因此您最好确保{要调用初始化静态变量的{1}}类不会抛出。来自MSDN:
如果静态构造函数抛出异常,则运行时将不会再次调用它,并且该类型将在运行程序的应用程序域的生命周期内保持未初始化状态。
最后,请考虑静态共享数据是线程安全问题的沃土,因此如果您要从不同线程读取和写入静态变量,则必须使用锁定来同步读取/写入操作或其他同步机制。