使用静态声明全局变量并避免使用单例模式

时间:2019-03-20 15:55:39

标签: c++

我想声明全局变量,避免使用Singleton Pattern,而是像这样使用静态变量,而不进行封装。最终目标是能够从任何函数/对象(如全局变量)访问变量。该代码无法在main()下的vec.pushback上编译,请在此处寻求帮助。代码有什么缺点?可以在多线程环境中使用吗?谢谢。

List<Student> studentList = new List<Student>() {
                new Student() { Id = 1, Name = "John"},
                new Student() { Id = 2, Name = "Steve"},
                new Student() { Id = 3, Name = "Bill"},
                new Student() { Id = 3, Name = "Bill"},
                new Student() { Id = 4, Name = "Ram" },
                new Student() { Id = 5, Name = "Ron" }
            };

1 个答案:

答案 0 :(得分:2)

  

为什么此代码无法编译?

int Properties::roll = 1;
    ^^^^^^^^^^^^
std::string Properties::name{};
            ^^^^^^^^^^^^
std::vector < std::string >             vec;
                            ^^^^^^^^^^^^

您已经正确定义了其他静态成员,但是未能定义Properties::vec。相反,您定义了一个全局::vec

  

代码的任何缺点?

可能:静态初始化顺序惨败。现在,这些静态对象不再相互依赖,但是如果您随时希望添加依赖于这些静态对象的静态对象(直接或间接在其构造函数或析构函数中),则程序可能会具有不确定的行为,具体取决于按照什么顺序初始化对象。

最好避免在不需要静态对象时使用它们。如果不这样做,则最好避免静态对象之间的依赖关系,尽管有时这种依赖关系可以很好地隐藏。如果失败,最容易发生惨败的方法就是在首次使用时初始化习语。只需使用本地静态变量而不是名称空间静态变量或静态成员即可。

struct Properties {
    int roll;
    std::string name;
    std::vector<std::string> vec;
};

Properties& static_properties() {
    static Properties prop;
    return prop;
}

  

可以在多线程环境中使用吗?

您的静态对象都不是原子的,因此您需要在修改对象的线程与访问该对象的所有其他线程之间进行某种形式的同步。

假设您照顾好同步,并且不对它们的状态做任何假设:当然。