gpt4 book ai didi

c++ - 从队列中显示二维数组后程序崩溃

转载 作者:行者123 更新时间:2023-12-03 06:11:42 35 4
gpt4 key购买 nike

我的 C++ 程序由一个名为 States 的类组成,它必须保存我的拼图的“状态”,它是一个 3x3 int 数组和其他两个整数。当我在 main 中声明它们并打印它们时,它们使用正确的值正确打印,但是将它们放入priority_queue中,按类中的整数之一排序并将其拉回后,它在数组中有垃圾并在以下情况下崩溃:它尝试显示。我不知道为什么当我把它放进去然后拉出来时它会变得垃圾,任何人都可以解释/帮助吗?

main.cpp:

#include "states.h"
#include <cstdlib>
#include <iostream>
#include <queue>

using namespace std;

int main(int argc, char *argv[])
{
priority_queue<States> statesQueue;
int puzzle[3][3];
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
puzzle[i][j] = i+j;

States myPuzzle(puzzle);
States myPuzzle2;

myPuzzle.printPuzzle();
myPuzzle2.printPuzzle();
myPuzzle.setFOfN(5);
myPuzzle2.setFOfN(0);

statesQueue.push(myPuzzle);
statesQueue.push(myPuzzle2);

if(statesQueue.empty()==true)
cout<< "This is empty" <<endl;
else
cout<< "This is not empty" <<endl;

statesQueue.top().printPuzzle();

system("PAUSE");
return EXIT_SUCCESS;
}

States.h:

#define STATES_H
#include <iostream>
using namespace std;

class States
{
public:

States ();
States (int puzzle[][3]);
~States();

int getFOfN() const;
void setFOfN(int num);

int getGOfN() const;
void setGOfN(int num);

void incGOfN();
int** getPuzzle() const;

void printPuzzle() const;

bool States::operator<(const States& rhs) const
{
return (fOfN < rhs.getFOfN());
}
States& operator = (const States& rhs)
{
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
cout<< i << " " << j << " " << rhs.getPuzzle()[i][j] <<endl;
puzzleGame[i][j] = rhs.getPuzzle()[i][j];
}
}
}


private:
int** puzzleGame;
int gOfN;
int fOfN;
};
#endif

States.cpp:

#include "states.h"
#include <iostream>

States::States ()
{
puzzleGame = new int*[3];

for (int i = 0; i<3; i++)
puzzleGame[i] = new int[3];

puzzleGame[0][0] = 1;
puzzleGame[0][1] = 2;
puzzleGame[0][2] = 3;
puzzleGame[1][0] = 4;
puzzleGame[1][1] = 0;
puzzleGame[1][2] = 5;
puzzleGame[2][0] = 6;
puzzleGame[2][1] = 7;
puzzleGame[2][2] = 8;

}
//-------------------------------------------------------------------------
States::States (int puzzle[][3])
{
puzzleGame = new int*[3];

for (int i = 0; i<3; i++)
puzzleGame[i] = new int[3];

for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
puzzleGame[i][j] = puzzle[i][j];
}
//-------------------------------------------------------------------------
States::~States()
{
for (int i=0; i<3; i++)
{
delete [] puzzleGame[i];
}
delete [] puzzleGame;
puzzleGame = 0;
}
//--------------------------------------------------------------------------
int States::getFOfN() const
{

return fOfN;
}
//-------------------------------------------------------------------------
void States::setFOfN(int num)
{
fOfN = num;
}
//--------------------------------------------------------------------------
int States::getGOfN() const
{

return gOfN;
}
//-------------------------------------------------------------------------
void States::setGOfN(int num)
{
gOfN = num;
}
//--------------------------------------------------------------------------
void States::incGOfN()
{
gOfN++;
}
//-------------------------------------------------------------------------
int** States::getPuzzle() const
{

return puzzleGame;
}
//-------------------------------------------------------------------------
void States::printPuzzle() const
{
std::cout<< "+---+---+---+" <<std::endl;
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
if(puzzleGame[i][j]==0)
std::cout<< "| ";
else
std::cout<< "| " << puzzleGame[i][j] << " ";
}
std::cout<< "|" <<std::endl;
std::cout<< "+---+---+---+" <<std::endl;
}
}
//-------------------------------------------------------------------------

这是每次显示时都会发生的情况: Picture

最佳答案

States违反了三法则,无法安全复制。 What is The Rule of Three?很高兴你问了。阅读链接。

在本例中,复制 States结果原始文件和拷贝都指向相同的 puzzleGame删除一个时需要 puzzleGame有了它,另一个现在是一个行走的定时炸弹,只是等待调用未定义的行为。

这是一个问题,因为推送到队列会生成一个拷贝,并且该拷贝可以被复制、移动、删除或队列的后备容器决定对其执行的任何其他操作。

简单的修复方法是替换动态 puzzleGame数组位于 States由于尺寸已知,因此使用静态的。 std::array may be helpful here.不太合适的选项包括使用 std::vector<std::vector<States>>并实现正确处理 puzzleGame 的赋值和移动运算符以及复制和移动构造函数.

关于c++ - 从队列中显示二维数组后程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36225440/

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