私有静态成员不能从公共静态成员函数访问
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
使用以 // ...
行声明的函数。这些函数没有使用我有问题的函数,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];
相关文章:
- 如何在C++中使用非静态成员函数作为回调函数
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 为什么传递非静态成员函数会导致编译错误?
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- std::异步与非静态成员函数
- C++无效使用非静态成员函数?
- 未使用的C++未优化的静态成员函数/变量
- C++:如何返回指向非静态成员函数的指针?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 在类定义中推导内联静态成员函数的返回类型
- `enable_if()`以禁用模板化类的静态成员函数声明
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 常量静态成员函数
- 使用 vector.sort() 的非静态成员函数无效使用
- 从静态成员函数访问私有非静态类变量 - C++