我很努力地理解我在这里遇到的问题。这是学校课程的一项任务。我在笔记本电脑上编写我的代码,并在学校的服务器上编译/测试/提交。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 << "\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
我看到:
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)
如果他们每个创建的那些各自的特点。在我的本地机器上,代码运行正确,并按照它应该用圆括号拼写出来。
我的生物类和.setStats()从creature.cpp的例子:
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 statement
,但只能在我的本地机器上工作,并且以后无法在远程服务器上工作(靠近p1Attack)?
'生物*生物1,*生物2; //创建对象'。不完全是。指针创建?是。他们有效吗?没有创建对象?号码 –
你应该为这两个生物分配记忆 – MORTAL
我觉得你正在做一些你没有显示的东西。这根本不应该运行,因为正如其他评论所说,生物2是无效的。所以我想你会剪掉实际创建这样一个对象的部分。无论如何,这听起来像你可能会遇到未定义的行为。一个不涉及任何外部资源但不尝试任何未定义的程序应该在各处编译相同的内容。 – 2015-11-07 05:24:12