与工作线类似的线路的分段故障 我开始通过学习一个项目来学习C++。我现在被一个分段错误阻塞了,更让我困惑的是,分段错误发生在一条线路上(第二次调用whatAmI()),这条线路与正常工作的线路(第一次调用whatAmI())非常相似。非常感谢您帮助我理解我遗漏了什么
以下是main()中的代码: BGame的构造函数:与工作线类似的线路的分段故障 我开始通过学习一个项目来学习C++。我现在被一个分段错误阻塞了,更让我困惑的是,分段错误发生在一条线路上(第二次调用whatAmI()),这条线路与正常工作的线路(第一次调用whatAmI())非常相似。非常感谢您帮助我理解我遗漏了什么,c++,segmentation-fault,polymorphism,C++,Segmentation Fault,Polymorphism,以下是main()中的代码: BGame的构造函数: BGame::BGame(Player *playerWhite, Player *playerBlack):playerWhite(playerWhite), playerBlack(playerBlack) {} class BGame { public: BGame(Player *playerWhite, Player *playerBlack); Player *playerWhite = 0; Play
BGame::BGame(Player *playerWhite, Player *playerBlack):playerWhite(playerWhite), playerBlack(playerBlack)
{}
class BGame
{
public:
BGame(Player *playerWhite, Player *playerBlack);
Player *playerWhite = 0;
Player *playerBlack = 0;
};
BGame声明:
BGame::BGame(Player *playerWhite, Player *playerBlack):playerWhite(playerWhite), playerBlack(playerBlack)
{}
class BGame
{
public:
BGame(Player *playerWhite, Player *playerBlack);
Player *playerWhite = 0;
Player *playerBlack = 0;
};
玩家的声明和代码:
class Player
{
private:
Colors playerColor;
public:
Colors getColor();
void setColor(Colors);
virtual std::string whatAmI();
Brain brain;
};
Colors Player::getColor()
{
return playerColor;
}
void Player::setColor(Colors color)
{
playerColor = color;
}
string Player::whatAmI()
{
return "A base player";
}
自动图层的声明和代码
class AutoPlayer : public Player
{
public:
virtual std::string whatAmI();
Brain brain = Brain();
};
std::string AutoPlayer::whatAmI()
{
return "A auto player";
}
编辑:
添加颜色定义:
enum class Colors {WHITE, BLACK};
当我将程序转换为MCVE时,我无法在clang++或g++上重现此错误。但是,我怀疑发生了什么。您为
BGame
(重新格式化)调用以下构造函数:
您对数据成员和参数使用相同的名称,因此如果编译器将playerWhite
初始化为自身而不是您的参数,它将保存垃圾。请查看将参数名称更改为black
和white
是否修复了该错误
顺便说一下,这是我将你的片段转换成的MCVE。请以后尝试发布MCVE:
#include <iostream>
#include <string>
enum class Colors {WHITE, BLACK};
struct Brain {};
class Player
{
private:
Colors playerColor;
public:
Colors getColor();
void setColor(Colors);
virtual std::string whatAmI();
Brain brain;
};
Colors Player::getColor()
{
return playerColor;
}
void Player::setColor(Colors color)
{
playerColor = color;
}
std::string Player::whatAmI()
{
return "A base player";
}
class AutoPlayer : public Player
{
public:
virtual std::string whatAmI();
Brain brain = Brain();
};
std::string AutoPlayer::whatAmI()
{
return "A auto player";
}
class BGame
{
public:
BGame(Player *playerWhite, Player *playerBlack);
Player *playerWhite = 0;
Player *playerBlack = 0;
};
BGame::BGame( Player *playerWhite,
Player *playerBlack )
: playerWhite(playerWhite),
playerBlack(playerBlack)
{}
int main(void) {
AutoPlayer playerWhite = AutoPlayer();
AutoPlayer playerBlack = AutoPlayer();
std::cout << playerWhite.whatAmI() << std::endl;
std::cout << playerBlack.whatAmI() << std::endl;
BGame bgame = BGame(&playerWhite, &playerBlack);
std::cout << "Black" << std::endl;
std::cout << bgame.playerBlack->whatAmI() << std::endl;
std::cout << "White" << std::endl;
std::cout << bgame.playerWhite->whatAmI() << std::endl;
return 0;
}
#包括
#包括
枚举类颜色{白色,黑色};
结构脑{};
职业选手
{
私人:
颜色播放颜色;
公众:
颜色getColor();
颜色;
虚拟std::string whatAmI();
脑;
};
颜色播放器::getColor()
{
返回播放颜色;
}
void Player::setColor(颜色)
{
playerColor=颜色;
}
std::string Player::whatAmI()
{
返回“一个基本玩家”;
}
职业:公共玩家
{
公众:
虚拟std::string whatAmI();
大脑=大脑();
};
std::string AutoPlayer::whatAmI()
{
返回“自动播放器”;
}
类BGame
{
公众:
BGame(Player*playerWhite,Player*playerBlack);
Player*playerWhite=0;
Player*playerBlack=0;
};
BGame::BGame(玩家*玩家白色,
播放器*playerBlack)
:playerWhite(playerWhite),
playerBlack(playerBlack)
{}
内部主(空){
AutoPlayer playerWhite=AutoPlayer();
AutoPlayer playerBlack=AutoPlayer();
std::这个例子能为我成功完成吗。你在使用什么编译器和什么编译标志?请提供一个。就目前而言,你的例子是不完整的。@FrançoisAndrieux:当没有定义Brain
或Colors
时,这怎么可能?请提供一个。你是否尝试在调试中运行你的代码ger?@AndyG您可以省略引用这些类型的任何内容。除非默认构造函数有副作用,否则本示例不会使用这些类型。代码可能是OP要排除的。感谢您将代码转换为MCVE。此代码不是为我运行的。现在我已更改了编译器,它可以正常工作。我想我应该尝试一下这是以前的问题,但我并不认为编译器是问题所在,而是我的代码中的某个错误——你的回答帮助我澄清了这一点。
#include <iostream>
#include <string>
enum class Colors {WHITE, BLACK};
struct Brain {};
class Player
{
private:
Colors playerColor;
public:
Colors getColor();
void setColor(Colors);
virtual std::string whatAmI();
Brain brain;
};
Colors Player::getColor()
{
return playerColor;
}
void Player::setColor(Colors color)
{
playerColor = color;
}
std::string Player::whatAmI()
{
return "A base player";
}
class AutoPlayer : public Player
{
public:
virtual std::string whatAmI();
Brain brain = Brain();
};
std::string AutoPlayer::whatAmI()
{
return "A auto player";
}
class BGame
{
public:
BGame(Player *playerWhite, Player *playerBlack);
Player *playerWhite = 0;
Player *playerBlack = 0;
};
BGame::BGame( Player *playerWhite,
Player *playerBlack )
: playerWhite(playerWhite),
playerBlack(playerBlack)
{}
int main(void) {
AutoPlayer playerWhite = AutoPlayer();
AutoPlayer playerBlack = AutoPlayer();
std::cout << playerWhite.whatAmI() << std::endl;
std::cout << playerBlack.whatAmI() << std::endl;
BGame bgame = BGame(&playerWhite, &playerBlack);
std::cout << "Black" << std::endl;
std::cout << bgame.playerBlack->whatAmI() << std::endl;
std::cout << "White" << std::endl;
std::cout << bgame.playerWhite->whatAmI() << std::endl;
return 0;
}