我正在编译一些将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
答案 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);