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

Protected enum not seen as type, why?

我正在编译一些将 emun 定义为受保护的代码,就像这样

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

我想像这样在我的方法中使用那个枚举,这个方法现在 public 在同一个 class

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);

这是为什么?我可以setAccScalepublic吗?

谢谢

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

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

#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;
}

根据您的错误判断:

../../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);

你的数据结构:

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

private:
    void setAccScale(A_Scale);
}

我可以假设您正在尝试从 MPU9250 class 外部调用 MPU9250::setAccScale,由于该函数的可访问性,这是不可能的。
另一件事是您正在尝试访问 MPU9250protected subtype 枚举。

对于修复,我建议让您的 A_scale public 可见或重写它以使用 #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);

方案二:

//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);

这两种解决方案都需要您创建一个 public 函数 SetAccScale 因为我假设您是从 MPU9250 类型之外设置这个比例的。

是的,如果您从外部使用 MPU9250::A_scale 或派生 class,请制作 A_scale public.

但由于 void setAccScale(A_scale accScale) 已经是私有的,因此不存在需要 public 仅使用 A_scale 的情况。你能准确地显示它被调用的地方吗,更多的上下文:

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