【问题标题】:C++: Declare a global class and access it from other classes?C++:声明一个全局类并从其他类访问它?
【发布时间】:2011-02-17 10:08:29
【问题描述】:

我有一个应该从 main() 全局声明并从程序中其他声明的类访问的类,我该怎么做?

class A{ 
    int i; 
    int value(){ return i;}
};

class B{ 
   global A a; //or extern?? 
   int calc(){
       return a.value()+10;
   }
}

main(){
   global A a;
   B b;
   cout<<b.calc();
}

【问题讨论】:

  • 我猜单格顿设计模式是从stackoverflow.com/questions/1008019/c-singleton-design-pattern开始的好点
  • @Artem - 再次强调 @gf 所说的 - 不要这样做!全局状态使代码无法组合和紧密耦合。除其他原因外,这很糟糕,因为它几乎无法进行测试。此外,我见过的几乎所有单例实现都不是线程安全的,但在代码运行在内存模型较弱的 CPU 上之前,您不会注意到这种微妙和令人不快的方式。

标签: c++


【解决方案1】:

在 C++ 中,声明一个类的全局实例是不允许的。

您应该改用单例模式,它为您提供了可从整个应用程序访问的对象的单个实例。

你可以找到很多关于 C++ 单例实现的文献,但是wikipedia 是一个很好的起点。

Thread safe singleton pattern implementation 已经在 stackoverflow 上讨论过。

【讨论】:

  • 不能使用全局,所以使用单例?你认为单例是什么?它是全球性的。只需使用全局并丢弃所有不需要的单实例废话。
【解决方案2】:

你可能真的不想这样做,但如果你必须 - 在包含 main 的文件中:

#include "A.h"
A a;

int main() {
 ...
}

然后在需要访问全局的文件中:

#include "A.h" 
extern A a;

您需要将 A 的声明放入 A.h 头文件中才能使其工作。

【讨论】:

  • 谢谢,externs 可以从其他类中看到吗?
  • @Regof 如果在文件范围内声明了某些内容(使用旧术语)并且没有标记为静态,则可以从任何地方访问它。这就是为什么创建这样的对象是一个坏主意。我永远不会在我自己的代码中创建这样的东西,我建议你也不要。但正如我所指出的,语言确实允许这样做。
  • 让我试一试...这只是一个实验,只是玩玩,别担心:-)
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2016-10-25
相关资源
最近更新 更多