c++ - 什么时候应该使用命名空间和单独编译? (是否可以在类外使用单独编译?)

标签 c++ function class compilation namespaces

关于命名空间,我不明白为什么不应该总是使用它们?对于每个头文件 (.hpp) 和每个源文件 (.cpp),在命名空间内声明所有内容似乎是一种很好的做法。是否存在您不想在单独文件中的命名空间内声明某些内容的情况?另外,单独的编译可以用于函数而不是类吗?我目前正在尝试使用 openGL 开发游戏,并且有几个单独的类使用当前在 main.cpp 中编写的相同函数。在单独的 .hpp 文件的命名空间中声明这些函数并在相应的 .cpp 文件中实现它们是否有意义,即使它们不是类的一部分?

它看起来像这样:

// foo.hpp
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

namespace Functions
{
    int function1(int x, int y, int z);
    void function2(char* ex);
    float function3(float a, float b, int c, int d);
}
#endif

// foo.cpp
#include "foo.hpp"

int Functions::function1(int x, int y, int z)
{
    // some code
}

void Functions::function2(char* ex)
{
    // some code
}

float Functions::function3(float a, float b, int c, int d)
{
    // some code
}

编辑: 关于解释简单地在类中实现它或不使用 namespace 替换类的注释和答案。澄清一下,我应该注意到并非所有这些类都继承自一个共同的祖先,因此我试图避免多次重写该函数。我并不是要用 namespace 完全替代传统类。有人提到静态类也可以实现这一点。所以我想我有点用命名空间替换静态类。因此,此时我的问题变成了为什么这是一件坏事?为什么对公共(public)使用的函数使用静态类而不是命名空间?如果我没记错的话,它们基本上是一样的:

// foo.hpp using class
class Functions
{
public:
    static int function1(int x, int y, int z);
};

// foo.hpp using namespace
namespace Functions
{
    int function1(int x, int y, int z);
}

// foo.cpp
int Functions::function1(int x, int y, int z)  // prepend static for use with class
{
    // implementation
}

// someOtherFile.cpp
    // some code
    int value = Functions::function1(1,2,3); // same use
    // more code

最佳答案

当然,您可以免费使用 namespaces随心所欲,您可以为每个源文件使用不同的命名空间。但是,我认为这对于编译单元本身来说可能有点过分而且有些多余。

命名空间的目标是避免大型项目中的名称冲突。这是一种将逻辑上属于同一类别的项目分组的方法。通常,您可以将它用于库(包括库的 versioning,如 Stroustrup 的书中所述)。或者引入某种模块化(无论是按层水平,还是按功能模块垂直)。

另一个用途是允许在 cpp 中使用匿名 namespace ,以保持对象私有(private)和 inaccessible from outside (无论是否嵌套)。

我认为(但这是个人观点), namespace 不应该被用作类的替代品,例如模拟 java 具有按类编译单元的做法。它应该被视为一种包装东西的方式。

编辑: 其他想法:如果您只想“避免多次重写函数”,并且如果函数原则上应该是一些成员函数,您可以考虑:

  • 如果有共同祖先,则将函数设为共同祖先的成员。
  • 如果没有共同祖先,要么使用CRTP或者将这些函数放在 mixin 中类
  • 如果您打算拥有多个版本的函数,并且对要使用的函数集进行静态或动态配置,请将每个集放在不同的类中并使用 strategy design pattern

另一方面,如果您的函数独立于它们的逻辑类,则可以很好地将它们放在命名空间中。我的观点主要是反对使用命名空间来替代类(即将一些函数放在一个实际上并不对应于某种抽象的类中),并且尽量为每个编译单元创建不同的命名空间。

关于c++ - 什么时候应该使用命名空间和单独编译? (是否可以在类外使用单独编译?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962400/

相关文章:

c++ - 模板化虚函数,管理来自单个类的不同类属性

c - 通过指针参数进行二维数组操作

javascript - 使用减号时不触发 onchange 事件

c++ - 从其他类文件 C++ 实现函数

java - 关闭 JFrame 但继续执行程序

c++ - 在C++中不使用平方根函数计算平方根

c++ - 监控表中的数据

java - 完成任务后显示 RAM Activity 增加的 Jar

c++ - 虚函数调用的编译器优化

Python:如何引用实例名称?