私有静态成员无法从公共静态成员函数访问?

时间:2014-10-20 18:34:31

标签: c++ scope visibility static-members

我们说我有以下代码:

#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内访问,或者不是?< / p>


修改

原始代码有450行,但我总结了一下。函数loopsetup使用在// ...行中声明的函数。这些函数没有使用我的有问题的函数,并且在{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();
}

1 个答案:

答案 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];