gpt4 book ai didi

c++ - C++ 中基类和派生类的作用域

转载 作者:行者123 更新时间:2023-11-28 05:59:20 25 4
gpt4 key购买 nike

我很难理解我在这里遇到的问题。这是学校类(class)的作业。我在我的笔记本电脑上编写我的代码,然后在学校的服务器上编译/测试/提交它。

我目前在 clion 中编写代码。当我在我的 Mac 终端上运行 gcc -vg++ -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 << "\n\t***Player 2's creature has taken fatal damage***" << endl;
cout << "\n\t* * * 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)

p1Attacks/p2Attacks 工作正常,所有数学结果都很完美。但是当我在我的学校服务器上运行战斗时,gcc 4.4.7 20120313 我看到:

第 1 回合,玩家 1 () 攻击玩家 2 ()
玩家 1 的攻击掷骰:7
玩家 2 的防御掷骰:1
玩家 1 的伤害输出:6
玩家2的护甲:3
玩家 2 受到的伤害:3
玩家 2 新实力:5

第一行不正确,它应该是第 1 回合,玩家 1(野蛮人)攻击玩家 2(爬行动物) 如果他们各自创建了相应的角色。在我的本地机器上,代码运行正确,并在括号中正确拼写出名称。

我的生物类和来自 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;
}

所以我的最终问题是,为什么 creature1->getName() 行在早期的 if 语句 中在我的笔记本电脑和学校服务器上都能正常运行,但只能在我的本地机器上工作,稍后无法在远程服务器上工作(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;
}

要解决这个问题,您需要将对象存储在不受自动内存管理影响的地方(例如在堆上),或者重新安排代码以利用它。

关于c++ - C++ 中基类和派生类的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33579283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com