C++中具有基类和派生类的作用域
Scope with Base and Derived Classes in C++
我很难理解我在这里遇到了什么问题。这是学校一门课程的作业。我在笔记本电脑上写代码,并在学校的服务器上编译/测试/提交。
我目前在clion中编写代码。当我在Mac的终端上运行gcc -v
或g++ -v
时,我会得到以下信息:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
在学校的服务器上运行相同的命令我得到:
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
我在不同版本的gcc上编译,不确定这是否会影响我的问题。向前
int main() {
int choice; // Used to get creature selection from user
Creature *creature1, *creature2; // Objects created
printCreatureList(); // Prints list of creatures for players to select from
choice = getIntFromUser(5); // Gets user choice for creature selection
if (choice == 1) {
Goblin newGob1;
creature1 = &newGob1;
newGob1.setStats();
cout << "Created " << creature1->getName() << " as player 1's creature.n";
// more if-else, and repeat for player 2 ...
}
现在,玩家1和玩家2各自创建了一个准备战斗的生物。注意,为了以后使用,creature1->getName()
在此处正常工作。以下是战斗循环中给我带来问题的部分。请注意,还有另一个版本,玩家2进攻,玩家1防守。
do { // Enter game loop
cout << endl << "nTurn #" << i << ", Player 1 (" << creature1->getName() << ") attacking Player 2 (" << creature2->getName() << ")";
i++;
p1Attacks(*creature1, *creature2, *p1Achilles, *p2Achilles); // Player 1 attacks, player 2 defends
if (creature2->getStrength() <= 0) { //Check if creature2 was defeated
cout << "nt***Player 2's creature has taken fatal damage***" << endl;
cout << "nt* * * Player 1 (" << creature1->getName() << ") has won the battle * * *" << endl;
winCondition = false;
break;
// advances on to p2Attacks
} while (winCondition);
我的p1Attack和p2Attack有类似的格式:
void p1Attacks(Creature &p1, Creature &p2, bool &p1AchillesInjury, bool &p2AchillesInjury)
p1攻击/p2攻击工作正常,所有的计算结果都很完美。但当我在学校服务器上运行战斗时,gcc 4.4.7 20120313
我看到:
Turn #1, Player 1 () attacking Player 2 ()
Player 1's attack roll: 7
Player 2's defend roll: 1
Player 1's damage output: 6
Player 2's armor: 3
Player 2 damage taken: 3
Player 2 new strength: 5
第一行不正确,如果他们每个人都创建了相应的字符,那么应该读Turn #1, Player 1 (The Barbarian) attacking Player 2 (Reptile)
。在我的本地机器上,代码运行正确,并正确拼写括号中的名称。
我的生物类和creature.cpp:中的.setStats()示例
class Creature {
public:
Creature() {}
/*
Functions: changeStrength()
Description: Change strength attribute for creature by reducing value
Parameters: reduceStrengthBy
Preconditions: None
Postconditions: Strength is reduced
*/
void changeStrength(int reduceStrengthBy);
int getAttackDice() { return attackDice; }
int getAttackSides() { return attackSides; }
int getDefenseDice() { return defenseDice; }
int getDefenseSides() { return defenseSides; }
int getArmor() { return armor; }
int getStrength() { return strength; }
std::string getName() { return name; }
bool getDodge() { return dodge; }
protected:
int attackDice;
int attackSides;
int defenseDice;
int defenseSides;
int armor;
int strength;
std::string name;
bool dodge;
};
void Reptile::setStats() {
attackDice = 3;
attackSides = 6;
defenseDice = 1;
defenseSides = 6;
armor = 7;
strength = 18;
name = "The Reptile";
dodge = false;
}
因此,我的最终问题是,为什么在早期的if statement
中,线路creature1->getName()
在我的笔记本电脑和学校服务器上都能正常工作,但只在我的本地机器上工作,以后无法在远程服务器上工作(接近p1Attack)?
如果某个东西在一台机器上工作,但在另一台机器不工作,那么您可以确定自己已经成为未定义行为的受害者。
事实上,你在使用悬空指针。基本上,它可以归结为:
int main(int, char**) {
int * pointer; // uninitialised, don't use
if (someCondition) {
int object = 42;
pointer = &object; // assigned to point to an object, can be used
} // object goes out of scope here
// pointer is dangling, don't use
cout << *pointer << endl; // oops
return 0;
}
要解决这个问题,您需要将对象存储在不受自动内存管理的位置(例如堆上),或者重新排列代码以利用它。
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 将作用域枚举转换为基础类型
- 表达式必须具有完整或无作用域的枚举图
- 在构造函数中输入对象时C++类成员作用域
- 无法让"std::enable_if"适用于无作用域枚举
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 从私有作用域中声明的类派生
- 派生类变量作用域 c++
- 使用具有相同名称的(无作用域)基类枚举初始化派生类枚举
- C++中具有基类和派生类的作用域