【问题标题】:How to put global functions which access non-global classes all in one place?如何将访问非全局类的全局函数放在一个地方?
【发布时间】:2011-02-08 16:43:53
【问题描述】:

我什至可能没有正确提出问题,但这是我的情况。我有一个命名空间,我想将所有全局函数放入其中。我想在相应的 .cpp 文件中定义它们。其中许多函数访问非全局类的实例,它们本身可能是也可能不是命名空间的成员。我可以前向声明类,但是当我尝试调用类方法时,我当然仍然会遇到链接器错误。一个(看起来很糟糕)的解决方案是在定义相应的类之后定义这些全局变量中的每一个,但这会将不同的函数放在不同的文件中,我想不惜一切代价避免这种情况,这样做似乎大错特错。

我还能做什么?我想我在这里遇到了一个概念问题,什么样的设计策略可能有助于解决这个问题?我必须使它们成为相应类的静态成员吗​​?我不喜欢这个 b/c 我的类有长名称,但我的命名空间名称很短......所以只使用 typedef?但从概念上讲,这些是全局函数,所以我想保持这种方式......感谢您的考虑。

【问题讨论】:

  • 简单地将类的头文件#include-ing 到你的“全局”源文件有什么问题?

标签: c++ class namespaces global


【解决方案1】:

我会在自己的头文件中自己定义“全局函数”。如果您需要添加前向声明,请在此处添加。

在 .cpp 文件中,只需根据需要包含其他“非全局”类和函数的标头即可。这将使公共 API 保持“干净”(头文件),同时让您可以在这些函数的实际代码中正常开发。

【讨论】:

  • 包含 *.h 文件是否足够?这似乎很奇怪,因为这些 *.h 文件本身必须#include 声明全局命名空间的 *.h 文件。无论如何,我今晚会试试这个(并再次发布),谢谢。
  • @Matt:是的。头文件应该被保护,所以类型只会被包含一次。前向声明负责循环引用...
  • @Matt:如果您的类依赖于全局函数库,而这些全局函数库又依赖于这些类,那么听起来您可能遇到了设计问题。考虑重构...
  • @Oli,您可能是对的——当然,给定类所依赖的全局函数和依赖于该类的全局函数是不同的。幸运的是,我的程序仍然足够小,可以让重构变得实用,所以我会看到。
【解决方案2】:

正如@Oli Charlesworth 所建议的那样,您可以在您的全局方法源文件中仅#include 相应的类头吗?

【讨论】:

    【解决方案3】:

    我无法将评论标记为答案,所以我将自己发布——基本上 Oli Charnesworth 是对的,重构是解决方案。有一个特定的类导致了我的循环依赖问题,我只是重新做了一些事情,使它不再依赖于“全局”信息,而是“全局”信息#included。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多