【问题标题】:How to organize header/class files in subdirectories in C++ (coming from Java)?如何在 C++(来自 Java)的子目录中组织头文件/类文件?
【发布时间】:2016-01-08 04:35:56
【问题描述】:

我是 C++ 新手,来自 Java,我需要将一个简单的项目从 Java 迁移到 C++。我很困惑如何在 C++ 中处理模块和类分离。该项目如下图所示。我理解(如果我错了,请纠正我)每个类都必须有一个头文件,以便其他系统可以使用我的库导入和使用它。但是由于 C++ 没有包,我不确定在 C++ 中处理该组织问题的正确/标准方法是什么。有人可以帮忙吗?

【问题讨论】:

  • 语言没有这样定义。由您决定。
  • 一个不错的方法是将包转换为普通的旧文件夹
  • @Taelsin 忘记命名空间,所以当我#include 时,我只会在文件夹中#include?但是,有人如何分发这样的库呢?
  • 如果答案对您有用,mark it as accepted。如果没有人这样做,请添加评论要求澄清或更正(如果需要)。

标签: java c++ module namespaces packages


【解决方案1】:

为了保持简单和干净,是的,每个类应该有自己的头文件和相应的实现 (.cpp) 文件。您可以为每个文件声明多个类,没有什么可以阻止您这样做,但如果这样做,您可能会花一些时间在文件中导航以找到您正在寻找的类(尽管“转到定义/声明”就可以了)。

您可以在项目中的 IDE 中创建过滤器,就像在 Eclipse 中创建包一样。我建议过滤器遵循您项目中 HDD 中的相同文件夹结构。

正如 Glenn 所说,您应该使用 C++ 命名空间。例如,您的“Time.java”文件将由“Time.hpp”和“Time.cpp”文件表示。

示例:

时间.hpp:

namespace your_project {
  namespace time {
    // Time class declaration
  }
}

CpuTime.hpp:

namespace your_project {
  namespace time {
    // CpuTime class declaration
  }
}

StringUtils.hpp:

namespace your_project {
  namespace utils {
    // StringUtils class declaration
  }
}

然后,如果您需要使用一个类,您只需包含标题即可。

Example.cpp

#include <Utils/StringUtils.hpp>

using namespace your_project::utils;

// Do stuff with StringUtils class

【讨论】:

  • 优秀的伊格纳西奥。还有一件事。我将如何分发我的库?只需编译为 SO 文件,文件夹层次结构将保留在 SO 中???
  • 那是另一个故事,我认为如果您搜索帖子,您会找到更完整的答案,但为了给您一些指导,您需要将头文件与您的库一起分发。文件夹层次结构将不复存在,剩下的只是库中定义的命名空间层次结构。既然你提到了“SO”,我假设你使用的是 Linux,那么它会更容易,因为你可以忘记你需要在 Windows 中使用的所有__declspec(dllexport)
  • 分组和分发头文件的最佳方式是什么?压缩文件夹层次结构?
  • 这主要取决于你的库的大小和用途。是的,您可以使用文件夹层次结构压缩标题(您需要创建一个新的“仅标题”结构),您可以实现一个库接口并仅分发一个标题。但正如我所说,这是完全不同的事情,你最好发布一个关于这个主题的新问题(不能用 600 个字符详细说明;))。
【解决方案2】:

C++ 有命名空间

您可以将每个目录映射到一个嵌套的命名空间

namespace myproject
{

   namespace time
   {

   }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多