【问题标题】:How can my private method access public enum in C++?我的私有方法如何访问 C++ 中的公共枚举?
【发布时间】:2017-10-16 16:58:34
【问题描述】:

我想知道如何或是否可以让我的公共 enum payloadTypes 在我的以下课程中被我的私有方法 threshold() 访问:

class A {

private: 
    unsigned int  threshold(payloadTypes kindOfPayload,int x,int y);

public:
 enum payloadTypes {
  INVALID =-1,
  TEST=0,
  THRESHOLDS,
  RX,
 };

}

如果我按照上述方式操作,我会收到此错误,并且我不想将我的枚举范围更改为 private

错误:“payloadTypes”尚未声明

无符号整数阈值(payloadTypes kindOfPayload,int x,int y);

【问题讨论】:

  • 您能否澄清thresholdGetter 是否是与threshold 不同的函数,或者它是否只是您问题中的“错字”?
  • @Angew 你说得对,这是一个“错字”

标签: c++ function class oop enums


【解决方案1】:

由于thresholdsGetter 不是类定义的一部分,因此您需要编写A::payloadTypes 而不是payloadTypes,因为Argument Dependent Lookup 无法解决问题。

或者,您在实现threshold 时是否有错字?根据编译器错误,您已经编写了thresholdsGetter。但是,尽管 Stroustrup 说了什么1,您仍然需要在类定义中声明enum 函数之前。如果您更正了,那么您的代码将照原样运行。


1注意

struct foo
{
    enum bar {};
    void foobar(bar b){}
};

编译,但是

struct foo
{
    void foobar(bar b){}
    enum bar {};
};

不会不会

【讨论】:

  • 可能是错别字了,当 OP 不粘贴代码而只是重写它时,这真是太棒了。
  • 你确定吗?当我编译类(在类中稍后声明枚举)时,我收到错误:unknown type name 'payloadTypes'。在函数删除错误之前移动枚举。
  • 参见this post,例如。
【解决方案2】:

您必须在使用枚举之前声明它。

class A {
public:
    enum payloadTypes {
        INVALID = -1,
        TEST = 0,
        THRESHOLDS,
        RX,
    };
private:
    unsigned int  threshold(payloadTypes kindOfPayload, int x, int y);

}

【讨论】:

  • 我不明白您的评论,该解决方案正是@gsamaras 提供的解决方案。
  • 糟糕。我在这里错了。将反对票转换为赞成票的简单编辑。道歉。
【解决方案3】:

您的编译器错误大约是thresholdsGetter(),但您显示的代码大约是threshold()。如果编译器错误是事实,那么您需要从以下位置更改原型:

unsigned int  thresholdsGetter(payloadTypes kindOfPayload,int x,int y);

到这里:

unsigned int  thresholdsGetter(A::payloadTypes kindOfPayload,int x,int y);

这样A::payloadTypes 会解析枚举,因为它是在函数之前定义的。如下所述,无法转发枚举。


如果您发布的代码是真实的,则以下情况成立:

问题是当你声明你的函数时,枚举没有被声明或定义。

这将起作用:

class A {

public:
 enum payloadTypes {
  INVALID =-1,
  TEST=0,
  THRESHOLDS,
  RX,
 };

private:
unsigned int  threshold(payloadTypes kindOfPayload,int x,int y);

};

但是,您不能转发声明枚举。在Forward declaring an enum in c++ 阅读更多内容。

【讨论】:

  • 这是不正确的。请注意,thresholdsGetter不是类定义的一部分。
  • @Bathsheba 你是什么意思?该函数是class A的成员函数,不是吗?
  • 不,threshold 是,不是 threseholdsGetter
  • @Bathsheba 抱歉再次质疑你,更新了!顺便说一句,你的回答很好。
  • 不用担心。这就是 SO cmets 的用途。现在这是一个很好的答案。投赞成票。
【解决方案4】:

C++ 中的任何内容都必须在使用前声明前向声明。它根本不是公共或私人的问题。它只是一个问题,当您在函数中使用枚举时,它尚未声明。但是,不能向前声明枚举,因此您必须交换公共和私有块才能使其工作。

【讨论】:

    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多