【问题标题】:C++ public enum in namespace of class类命名空间中的 C++ 公共枚举
【发布时间】:2021-02-10 19:28:38
【问题描述】:

我正在创建一个类,我想在该类中创建一个枚举,以便只能通过该类的命名空间访问它。我希望用户能够像这样访问类之外的枚举:

GpioPin pin(23, GpioPin::OUTPUT);

其中 GpioPin 是类,OUTPUT 是枚举值之一。

我尝试将枚举放在类的顶部,并尝试将它放在公共标签下,例如(包含用于帮助调试的构造函数):

public:
    enum pin_dir {
        INPUT,
        OUTPUT,
    };

    GpioPin(int pin_num, pin_dir dir): pin_num(pin_num), dir(dir) {
        std::string dir_str; 
        if(dir == INPUT){
            dir_str = "in";
        } else if (dir == OUTPUT){
            dir_str = "out";
        } else {
            std::cout << "invalid direction in constructor for pin " << pin_num << std::endl;
            return;
        }

        init_gpio_pin(pin_num, dir_str.c_str());
    }

但是当在公共标签下时,构造函数的行为就像枚举不存在并引发编译器错误。

有谁知道这样做的正确方法吗?

谢谢

编辑:问题已解决。此处描述的代码是正确的并且按预期工作。接受的答案提供了一些关于 C++ 中枚举类的好信息

【问题讨论】:

  • 我们可以得到一个minimal reproducible example 的无效代码吗?另外,请包括完整的错误文本。释义经常会丢失有价值的信息。
  • 确定我会在几秒钟内编辑它。错误文本很长,涉及很多不同的错误,这些错误都源于编译器认为枚举类型不存在的主要问题
  • 如果操作系统是Linux,我建议使用libgpiod

标签: c++ class oop enums gpio


【解决方案1】:

查看枚举类(google for c++ enum class)。

Class Foo {
public:
    enum class Color{ Red, Green, Blue};
};

然后,您将事物引用为:

Foo::Color::Red

效果很好。

【讨论】:

  • 这不能回答问题。 OP 无法让类中的常规枚举正常工作。
  • @Kevin 我认为它确实回答了他的问题。并不是说他无法让班级中的枚举工作 - 这是他正在处理的命名约定。
  • 但是 OP 希望用户能够做到:GpioPin pin(23, GpioPin::OUTPUT);。使用他们必须做的枚举类:GpioPin pin(23, GpioPin::pin_dir::OUTPUT);
  • OP 写的应该可以工作(如果写成完整的代码)。没有足够的信息来回答为什么它不起作用或需要修复什么,这就是为什么请求minimal reproducible example
  • @Dyskord 您向我们展示的内容应该有效,是的。您需要向我们提供minimal reproducible example,以便我们帮助您了解问题。
猜你喜欢
  • 1970-01-01
  • 2013-09-08
  • 2023-03-30
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2014-09-07
  • 2011-10-28
  • 2019-07-22
相关资源
最近更新 更多