【问题标题】:Best implementation of a global variable全局变量的最佳实现
【发布时间】:2013-05-31 22:07:50
【问题描述】:

我的一个类中有一个变量:

Object * myObject;

我现在需要我的其他课程才能在其他课程中访问。

访问它的最佳方式是什么?

下面的实现是否正确?

#ifndef GLOBALS_H
#define GLOBALS_H

#include "Object.h"

Object * myObject[5][5];

#endif

编辑:

更多信息,基本上我有A类和B类。

类 A 具有类 B 需要访问的变量 myObject。 A 类也有 B 类的对象,这意味着我不能在 B 类的标头中包含 A 类的标头,因为 A 类的标头包含 B 类的标头。

【问题讨论】:

  • 如果它已经在一个类中,您可以简单地在需要的地方传递该类的一个对象。在main() 中实例化它。

标签: c++ class object


【解决方案1】:

最好将对象的引用传递给其他感兴趣的类。假设您不能这样做并且确实需要一个全局变量,那么您最好使用

extern Object * myObject;

在 globals.h 和

Object * myObject;

在 globals.cpp 中

否则每个包含 globals.h 的源文件都会选择 myObject 的重复定义

【讨论】:

    【解决方案2】:

    如果您的所有类都共享同一个对象,您可以将其作为静态变量添加到基类中。

    class base
    {
        static Object* myObject;
    };
    
    class inherit : base
    {
        void foo()
        {
             // can access myObject
        }
    };
    
    class inherit2 : base
    {
        void bar()
        {
             // can access myObject
        }
    };
    

    【讨论】:

      【解决方案3】:

      用于存储全局变量的最被社会接受的解决方案绝对是singleton。 C++ 中的典型实现如下所示:

      #include <iostream>
      using namespace std;
      
      class Singleton
      {
      public:
              static Singleton& Get() {
                      static Singleton singleton;
                      return singleton;
              }
      
              void DoSomething() { cout << "Something!\n"; }
      
      private:
              Singleton() {}
      };
      
      int main()
      {
              Singleton::Get().DoSomething();
      }
      

      与典型的全局变量相比,它的主要优点是您可以更好地控制对象的构造方式。

      别忘了它仍然是一个全局变量,所以你应该只在它是最不邪恶的替代品时使用它。

      【讨论】:

      • 关于这个的快速说明:在 c++11(vs 2012,我认为是 g++4.7)之前,这在多线程环境中是不安全的;为了说明,在 Singleton 的构造函数中添加 Sleep(3000); cout &lt;&lt; "Done constructing" &lt;&lt; endl; 并启动 3 个调用 Get().DoSomething() 的线程。你会看到“某事!”在您看到施工完成的消息之前两次。即,您将一直在使用未构造的对象!这在新标准中得到解决
      • -1 单例不是一种创建全局变量的方法,它们是一种确保类只有一个实例的方法。最好使用静态成员或仅使用全局成员。
      • 是的,它们确保您只有一个全局变量实例,但它仍然只是一种全局变量。问题是要求全局变量的实现,如果您不相信单例属于该保护伞,那您就是在自欺欺人。
      • 是的,它们是全球性的,但它们不为社会所接受,而且他获得的不仅仅是一个全球性的,他是在项目期间获得一个类的单个实例。
      • “社会上可接受的”和“社会上最可接受的”之间存在天壤之别。我的回答非常明确,单身人士仍然是邪恶的。我不会说单例给你的不仅仅是一个全局。单例实际上受到更多限制。它们的持续时间较短(因为它们是在第一次使用而不是在程序启动时实例化的)并且您仅限于类的一个实例。你得到 less 的单例。 故意
      猜你喜欢
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2023-04-07
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2016-07-23
      相关资源
      最近更新 更多