C++ 正确使用来自另一个类的枚举

C++ Using an enum from another class properly

本文关键字:另一个 枚举 C++      更新时间:2023-10-16

我目前正在使用OpenGL实现一些代码,并且我已经为各种OpenGL类创建了包装器。特别是,我有一个缓冲区类,可以表示顶点数组缓冲区或元素数组缓冲区。为此,我在标头中声明了我的类,如下所示:

Buffer.h
namespace FE { namespace GL {
    enum BufferType {
        ARRAY = GL_ARRAY_BUFFER,
        ELEMENT = GL_ELEMENT_ARRAY_BUFFER
    };
    class Buffer {
    public:
        Buffer(BufferType type);
        ... rest of class ...
    };
}

在我的 Renderer 类中,我尝试将一些缓冲区实例化为类成员:

Renderer.h
...
#include "../GL/Buffer.h"
namespace FE { namespace Render {
    class Renderer {
    ...
    private:
        GL::Buffer vbo(GL::BufferType::ARRAY);
        GL::Buffer element(GL::BufferType::ELEMENT);
    };    
}}

出于某种原因,尝试以这种方式使用枚举会给我错误"语法错误:标识符'ELEMENT'"。Intellisense还警告说,"常量'FE::GL::ELEMENT'不是类型名称。

不太确定为什么这不起作用,就像以前在测试我的缓冲区相关代码时一样,我以类似的方式创建了缓冲区(通过使用 scope 运算符访问枚举值)。

有关如何解决此问题的任何帮助将不胜感激。

枚举

不会在C++中创建作用域。枚举的类型是FE::GL::BufferType但要使用它,您只需键入GL::Buffer vbo(GL::ARRAY);

如果需要作用域枚举(使用 C++11),请使用enum class

如果要默认初始化成员,则需要使用大括号{}=

非静态数据成员可以通过以下两种方式之一进行初始化:

2) 通过默认成员初始值设定项,

它只是成员声明中包含的大括号或等于初始值设定项, [...]

namespace FE { namespace Render {
    class Renderer {
    private:
        GL::Buffer vbo{GL::BufferType::ARRAY};
        GL::Buffer element{GL::BufferType::ELEMENT};
    };    
}}

包含这些限制是为了避免成员函数声明和默认成员初始值设定项之间的友好性,请参阅提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm(特别是问题 1 部分)。