[英]Private static member not accessilble from public static member function?
假设我有以下代码:
#define STACK_SIZE 5
class Stack {
private: static int iStackPos;
private: static void *rgpvStack[STACK_SIZE];
public: static void Push (
void *pvElem);
};
int Stack::iStackPos = 0;
void *rgpvStack[STACK_SIZE];
void Stack::Push (void *pvElem) {
if (Stack::iStackPos < STACK_SIZE) { // [1]
Stack::rgpvStack[Stack::iStackPos++] = pvElem; // [2]
}
}
编译时(使用AVR-GCC,03/2012)时,出现以下错误:
在[1]: Stack::iStackPos
是私有的
在[2]: Stack::iStackPos
是私有的
在[2]: Stack::rgpvStack
是私有的
我知道这些变量是私有的,因为我将它们标记为private:
:,因为它们在此类之外不可访问。 如果我没记错的话, Push
是Stack
的成员,那么iStackPos
和rgpvStack
应该可以在Push
访问吗?
编辑:
原始代码有450行,但我对其进行了一些总结。 函数loop
和setup
使用// ...
声明的函数。 这些函数没有使用我有问题的函数,并且在Arduino Uno板头中的某个位置声明了boolean
。 实际上,我在缩短代码并标记它们时看到了(非常愚蠢的)错误(请参见下文)。 还是要谢谢你 :)
#define STACK_SIZE 5
// ...
class Stack;
// ...
class Stack {
private: static int iStackPos;
private: static void *rgpvStack[STACK_SIZE];
public: static boolean Pop (
void *pvElem);
public: static boolean Push (
void *pvElem);
};
// ...
int Stack::iStackPos = 0;
void *Stack::rgpvStack[STACK_SIZE];
boolean Pop (void *pvElem) { // !!! Must be Stack::Pop !!!
// TODO
return false;
}
boolean Push (void *pvElem) { // !!! Must be Stack::Push !!!
if (Stack::iStackPos < STACK_SIZE) {
Stack::rgpvStack[Stack::iStackPos++] = pvElem;
return true;
}
return false;
}
// ...
void loop () {
// CLI::ProcessSerial();
//
// // Animate LEDs
// Prog::pAnim->Calculate();
//
// for (int n = 0; n < 5; n++) {
// Prog::pMgr->Set(n, Prog::pAnim->pColor);
// }
//
// Prog::pMgr->Sync();
//
// // Delay
// delay(BOARD_LOOP_DELAY);
}
void setup () {
Serial.begin(BOARD_SYMBOL_RATE);
while (!Serial);
// Prog::Prog::pMgr = new LedMgr(A0, 5);
//
// Prog::pAnim = new Animation(2000);
// Prog::pAnim->pfnFinished = Prog::AnimFinished;
// Prog::pAnim->pInColor = new Color(0, 20, 0);
// Prog::pAnim->pOutColor = new Color(0, 0, 20);
//
// CLI::ShowHelp();
}
如果您编写的函数定义如下,则会发生此错误
void Push (void *pvElem) {
if (Stack::iStackPos < STACK_SIZE) { // [1]
Stack::rgpvStack[Stack::iStackPos++] = pvElem; // [2]
}
}
代替
void Stack::Push (void *pvElem) {
if (Stack::iStackPos < STACK_SIZE) { // [1]
Stack::rgpvStack[Stack::iStackPos++] = pvElem; // [2]
}
}
考虑到
void *rgpvStack[STACK_SIZE];
必须有
void * Stack::rgpvStack[STACK_SIZE];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.