我的私有方法如何在C ++中访问公共枚举?

时间:2017-05-17 09:49:14

标签: c++ function class oop enums

我想知道如何或者如果我可以在以下课程中使用我的隐私方法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'尚未声明

     

unsigned int threshold(payloadTypes kindOfPayload,int x,int   Y);

4 个答案:

答案 0 :(得分:6)

由于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 {};
};

答案 1 :(得分:4)

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

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

}

答案 2 :(得分: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++中的更多内容。

答案 3 :(得分:1)

C ++中的任何内容都不能在未使用前声明转发声明。它根本不是公共或私人问题。它只是一个问题,当你在函数中使用枚举时,它尚未声明。然而,枚举不能向前宣布,所以你将不得不交换公众&私人街区让它发挥作用。