私有静态成员不能从公共静态成员函数访问

Private static member not accessilble from public static member function?

本文关键字:静态成员 函数 访问 不能      更新时间:2023-10-16

假设我有以下代码:

#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: 标记了它们,因为它们在此类之外无法访问。如果我没记错的话,PushStack的成员,所以iStackPosrgpvStack应该可以在Push内访问,还是不?


编辑:

原始代码有 450 行,但我总结了一下。函数loopsetup使用以 // ... 行声明的函数。这些函数没有使用我有问题的函数,boolean在Arduino Uno板的标题中声明。实际上,当我缩短代码并标记它们时,我看到了我的(非常愚蠢的(错误(见下文(。无论如何谢谢你:)

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