我们说我有以下代码:
#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
内访问,或者不是?< / p>
修改
原始代码有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();
}
答案 0 :(得分:2)
如果您编写了像
这样的函数定义,则会发生此错误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];