【问题标题】:The best way to access values of variables defined elsewhere without 'extern'?访问没有“extern”的其他地方定义的变量值的最佳方法?
【发布时间】:2014-02-16 21:06:52
【问题描述】:

我最近开始学习 C++,目前正在阅读很多关于它的资料。 不断重复的一件事是使用extern 拥有一些全局变量是一种不好的做法,我应该避免它。 问题是在某些情况下我看不到全局变量的替代方案,例如当我在一个文件中有“产品目录”(包含名称、描述、价格等)并且需要在任何其他文件中显示目录中的单个变量的值时。

我注意到有些人避免使用extern 的一种方法是使用const 来拥有常量变量。

我的问题是,这不只是将 extern 换成另一个(至少在这种情况下)工作方式几乎相同的关键字,而且这突然不是一个坏习惯吗?

【问题讨论】:

  • 也许你应该在你的应用程序中使用单例。
  • const 和 extern 是非常不同的东西 - const 表示某些东西不会改变,而 extern 表示实际变量将在其他地方找到 - 我的意思是不在 extern 语句所在的文件中.
  • @TimBergel 我明白了。所以extern 可以从另一个文件中更改,而const 不能,对吗?

标签: c++ variables constants extern


【解决方案1】:

您可能希望将产品目录等数据封装在某种对象中。然后,您将查询该对象以从中获取一些数据。如果您需要另一个源文件中的对象,通常您会编写一个接受目录对象作为参数的函数或方法,并且调用者需要将对象传递给该方法或函数。所以你可能在一个源文件中有这个:

class ProductCatalog
{
    public:
        ProductCatalog();
        virtual void ~ProductCatalog();

        int getNumItems();
        Product* getItemAtIndex(const int index);
        // ... whatever else your product catalog needs
 };

然后在其他一些源文件中,您将创建一个产品目录,然后将其传递给任何需要它的函数或方法,如下所示:

void DoSomeWork ()
{
    ProductCatalog catalog;
    AddProductsToCatalog (catalog); // <- Here you pass the catalog to someone else to work with

    int numProds = catalog.getNumItems();
    for (int i = 0; i < numProds; i++)
    {
        Product* nextItem = catalog.getItemAtIndex(i);
        // ... do something with product here ...
    }
}

【讨论】:

  • 是的,这看起来像我想要的。我会玩弄它并报告,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多