受保护的枚举不被视为类型,为什么?

时间:2017-03-15 10:14:22

标签: c++ arduino protected

我正在编译一些将emun定义为受保护的代码,比如

class MPU9250
{
  protected:
    // Set initial input parameters
    enum A_scale
    {
      AFS_2G = 0,
      AFS_4G,
      AFS_8G,
      AFS_16G
    };
}

我想在我的方法中使用这个枚举,这个方法现在在同一个类中公开

void setAccScale(A_scale accScale);

然而在编译错误时说

../../MPU9250.h: In function 'void initMovementDetected()':
../../MPU9250.h:196:7: error: 'MPU9250::A_scale AFS_8G' is protected
       AFS_8G,
       ^
../../nRF52.cpp:49:31: error: within this context
  mpu9250.setAccScale(MPU9250::AFS_8G);

这是为什么?我可以公开setAccScale吗?

由于

class MPU9250
{
  protected:
    // Set initial input parameters
    enum A_scale
    {
      AFS_2G = 0,
      AFS_4G,
      AFS_8G,
      AFS_16G
    };
 public:
       void setAccScale(A_scale accScale);

}

编辑:我发现部分错误,还有一个名为Ascale的变量,我将枚举重命名为A_scale

3 个答案:

答案 0 :(得分:1)

如果您要在该范围之外使用枚举,我认为您需要公开课。此外,您需要在函数中使用参数并且缺少分号。我不确定你为什么要在类中声明一个函数?但这是你的代码与那些更正。希望我能够帮到你。

#include "stdafx.h"
#include <iostream>

class MPU9250
{
public:
    // Set initial input parameters
    enum Ascale
    {
        AFS_2G = 0,
        AFS_4G,
        AFS_8G,
        AFS_16G
    };
    void setAccScale(Ascale accScale) {
        std::cout << accScale << std::endl;
    } // function needs argument

};// missing semi-colon
int main() {
    return 0;
}

答案 1 :(得分:1)

根据您的错误判断:

  

../../ MPU9250.h:在函数'void initMovementDetected()'中:
  ../../MPU9250.h:196:7:错误:'MPU9250 :: A_scale AFS_8G'受到保护          AFS_8G,
         ^
  ../../nRF52.cpp:49:31:错误:在此背景下     mpu9250.setAccScale(MPU9250 :: AFS_8G);

您的数据结构:

class MPU9250
{
protected:
    enum A_scale
    {
      AFS_2G = 0,
      AFS_4G,
      AFS_8G,
      AFS_16G
    };

private:
    void setAccScale(A_Scale);
}

我可以假设你试图从MPU9250::setAccScale类之外调用MPU9250因为该功能的可访问性而不可能。 另一件事是您尝试访问protected subtype MPU9250的{​​{1}}枚举。

对于此修复程序,我建议您将A_scale公开显示或重写此内容以使用#define

解决方案1:

// define this in some header
#ifndef AFS_2G
#    define AFS_2G 0
#endif

#ifndef AFS_4G
#    define AFS_4G 1
#endif
// rest of your values ...

//to use this:
mpu9250.SetAccScale(AFS_2G);

解决方案2:

//declare this enum as public :
class MPU9250
{
public:
    enum A_scale
    {
        AFS_2G = 0,
        AFS_4G = 1
        // rest of your values
    }
};

// to use this:
mpu9250.SetAccScale(MPU9250::A_scale::AFS_2G);

这两个解决方案都要求您创建公共函数SetAccScale,因为我假设您要从MPU9250类型之外设置此比例。

答案 2 :(得分:0)

是的,如果您在此类或派生类之外使用MPU9250::A_scale,请将A_scale公开。

但由于void setAccScale(A_scale accScale)已经是私有的,因此没有需要公开使用A_scale的情况。你能准确地显示它的调用位置,更多的背景:

../../nRF52.cpp:49:31: error: within this context
  mpu9250.setAccScale(MPU9250::AFS_8G);