C++报错:targetsoldier未在当前作用域声明——新手指针求助
解决
targetsoldier was not declared in this scope错误 嘿,作为C++新手碰到这种变量/类名冲突的坑太正常了!我一眼就看到问题出在哪了——你把函数参数名和类名弄成一样的啦!
先看你的函数定义:
void level::battle(soldier *soldier, int targetx, int targety) {
这里你把指针参数命名成了soldier,而你的类名恰好也是soldier。在这个函数的作用域里,编译器会优先把soldier识别成这个指针参数,而不是你的类名。当你写下面这行代码时:
soldier *targetsoldier = getsoldier(targetx, targety);//错误出现在此行
编译器根本找不到soldier这个类的定义(因为被参数名覆盖了),自然就会报错说targetsoldier没在当前作用域声明——本质是它没法理解你要声明一个soldier类的指针。
两种简单的解决办法:
- 最推荐:重命名函数参数
把参数名改成和类名不一样的,比如叫attacker或者currentSoldier,代码瞬间就清晰了:
void level::battle(soldier *attacker, int targetx, int targety) { int x, y; int enemyarmy; attacker->getposition(x, y); soldier *targetsoldier = getsoldier(targetx, targety); if(targetsoldier == nullptr){ return; } enemyarmy = targetsoldier->getarmy(); // 补全你没写完的getarmy()假设 // 后续战斗逻辑 }
- 备选:用全局作用域解析符明确类名
如果实在不想改参数名,可以用::告诉编译器你指的是全局作用域下的soldier类:
::soldier *targetsoldier = getsoldier(targetx, targety);
最后给你个新手友好的小建议:C++里通常把类名首字母大写(比如Soldier),变量/参数用小写或驼峰命名,这样一眼就能区分类和变量,再也不会踩这种命名冲突的坑啦!
内容的提问来源于stack exchange,提问作者Anirudh
相关产品推荐
相关产品推荐

