【问题标题】:How to get rid of repeatedly writing namespace_name:: inside class headers如何摆脱在类头中重复写入 namespace_name::
【发布时间】:2016-02-07 13:47:49
【问题描述】:

我有一个类,它广泛使用特定命名空间的成员,如下所示:

class Entity {

    using namespace glm;

  public:

    Entity(vec3 position, vec3 direction, vec3 upVector, vec3 velocity, float speed = 0.0f);
    Entity(vec3 position, vec3 direction, vec3 upVector);
    Entity(vec3 position, vec3 direction);
    virtual ~Entity() {}

    vec3 position()   { return this->pos; }
    vec3 direction()  { return this->dir; }
    vec3 upVector()   { return this->upVec; }
    vec3 velocity()   { return this->vel; }
    float speed()     { return this->spd; }

    // lots of other methods

  protected:

    vec3 pos;
    vec3 dir;
    vec3 upVec;
    vec3 vel;
    float spd;

    // lots of other members

};

我刚刚发现using namespace 不允许在课程中使用,所以我不能这样做。 我只能看到 2 个选项如何摆脱这种情况,这两个选项都很愚蠢:

  1. 在每次使用成员(vec3、vec4、mat3、...)之前重复 namespace_name:: (glm::)
  2. 在类外声明 using namespace 并将这个命名空间强制给每个人,包括我的标题

有没有更好/更干净的方法,如何解决这个问题?

【问题讨论】:

  • 使用 typedef?类似于 typedef glm::X glmX ?
  • 在类中使用 glm::vec3 会起作用
  • 为什么 1 有问题?我会说这是最佳实践,也是最易读的。
  • 我不介意写命名空间,如果只有少数使用它的成员的情况,但是当它有很多时 1. 一段时间后它开始写它真的很烦人到处。 2. 看起来很丑,代码向右展开到屏幕外。 3. glm 库旨在提供与 OpenGL 着色语言相同的工具,它使用这些东西作为 vec3,mat3,... 没有任何前缀。

标签: c++ class namespaces header-files


【解决方案1】:

如果您查看this previous question,您可能会对解决此问题的方法有所了解。 我相信大多数人都同意在头文件中定义无限范围的命名空间是一个坏主意,因为它会影响包含您的头文件的所有其他文件。 如果允许语法,则将您的类和命名空间包含在另一个块中似乎是最好的解决方案。因此,命名空间范围将被限制在您的外部块中。 不幸的是,我已经有一段时间没有认真地从事 C++ 工作了,我不记得编译器在头文件中是否允许这种语法:

{
using namespace glm;

class Entity {
    ...
}

}

【讨论】:

  • 如果上面的块也是命名空间,那么是的
【解决方案2】:

如果你只是要经常使用vec3,你可以使用typedef

class Entity {
public:
    typedef glm::vec3 vec3;

    Entity(vec3 position, vec3 direction, vec3 upVector, vec3 velocity, float speed = 0.0f);
    // more things...
};

希望这会有所帮助。

【讨论】:

  • 为什么不只是using glm::vec3;
  • @zenith:可以在课堂上写这个吗?因为如果不是,你仍然强制你的包含器从命名空间 glm 到这个元素 vec3
  • 是的,using 在课堂内是可能的。
【解决方案3】:

作为一种良好做法,您自己的类也应该在命名空间中。你可以把 using 语句放在那里。

namespace MyProject
{
    using namespace glm;

    class Entity
    {
        ...
    };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2020-07-30
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多