Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与工作线类似的线路的分段故障 我开始通过学习一个项目来学习C++。我现在被一个分段错误阻塞了,更让我困惑的是,分段错误发生在一条线路上(第二次调用whatAmI()),这条线路与正常工作的线路(第一次调用whatAmI())非常相似。非常感谢您帮助我理解我遗漏了什么_C++_Segmentation Fault_Polymorphism - Fatal编程技术网

与工作线类似的线路的分段故障 我开始通过学习一个项目来学习C++。我现在被一个分段错误阻塞了,更让我困惑的是,分段错误发生在一条线路上(第二次调用whatAmI()),这条线路与正常工作的线路(第一次调用whatAmI())非常相似。非常感谢您帮助我理解我遗漏了什么

与工作线类似的线路的分段故障 我开始通过学习一个项目来学习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

以下是main()中的代码:

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;
};
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;
}