【发布时间】:2015-08-02 08:03:57
【问题描述】:
大家!
我刚写完一个使用动态内存分配的二维迷宫(类是一个名为“迷宫”的 ADT——多么原始)。我将迷宫传递给另一个名为“MazeSolver”的类的方法,它使用递归和回溯来解决迷宫。好消息是当我通过引用传递对象时,我的代码编译得非常好。我不知道是好是坏的消息是,如果我尝试按值将 Maze 传递给 MazeSolver,则会收到断言错误。
鉴于错误仅在我按值传递时发生,我只能假设它与我的复制构造函数有关。在继续之前,这里有一些关于代码的信息:
迷宫由正方形组成。每个正方形都由一个名为 SquareData 的结构表示。
struct SquareData
{
//data fields for the struct (NO POINTERS)
}
我决定用一个 SquareData 指针向量来表示整个迷宫(这个向量在“迷宫”类的私有部分中)。
vector<SquareData*> squares;
我的析构函数的实现看起来像这样(最后一次调用引用 Player 类只是消除了我声明为该类的静态变量的悬空指针,我已经指向迷宫。我不认为这很重要考虑到这个问题,但毕竟我是 C++ 新手,你们中的一个人可能认为它可能是,所以我将它包含在“hmmms”中):
// clears maze of its contents
void Maze::clear() {
int totalSquares = squares.size();
for (int loopVar = 0; loopVar < totalSquares; loopVar++)
{
delete squares[loopVar]; // deallocate memory by deleting the square structure
squares[loopVar] = nullptr; // eliminate dangling pointer
} // vector takes care of itself
} // end clear
Maze::~Maze(){
//clear the maze of contents (vector is full of pointers whose memory is on the heap)
clear();
//vector safe to deallocate itself now
Player::setMaze(nullptr); // remove the pointer from player
}
我在 header 中声明了复制构造函数,如下所示:
/** Copy Constructor */
Maze(const Maze& myMaze);
尝试实施:
/** copy constructor */
Maze::Maze(const Maze& myMaze){
/** Initialize Constants */
mazeLength = myMaze.mazeLength;
mazeWidth = myMaze.mazeWidth;
exitRow = myMaze.exitRow;
exitCol = myMaze.exitCol;
entRow = myMaze.entRow;
entCol = myMaze.entCol;
/** copy the vector of pointers*/
for (int loopVar = 0; loopVar < myMaze.squares.size(); loopVar++)
{
squares.push_back(myMaze.squares[loopVar]);
}
} // end copy constructor
以下是我试图了解问题所在的方法:
我为我的 Maze 类编写了这个矢量显示函数。
void Maze::vectorDisplay() const {
for (int loopVar = 0; loopVar < squares.size(); loopVar++)
{
cout << "Vector Index: " << loopVar << endl;
cout << "Pointer: " << squares[loopVar] << endl;
cout << "Row: " << squares[loopVar]->Row << endl;
cout << "Col: " << squares[loopVar]->Col << endl;
cout << "State: " << squares[loopVar]->State << endl;
}
} //end vectorDisplay
并且发现在驱动中执行以下操作时矢量显示正确:
Maze myMazeObject(// parameters);
myMazeObject.vectorDisplay();
并且会毫无怨言地产生输出。
但是现在如果我在传递值时尝试使用这样的代码:
Maze myMazeObject(// parameters);
MazeSolver myMazeSolver;
myMazeSolver.someMazeSolverMethod(myMazeObject);
其中 someMazeSolverMethod 有行 myMazeObject.vectorDisplay();我得到一个断言错误,就像正在打印向量中的最后一个元素一样。
我想说这是我的错,我的复制构造函数是一个 p.o.s.如果有任何见解,请告诉我如何解决它以及我将来可以做什么!
感谢您抽出宝贵的时间阅读,如果您愿意,请务必回答!
-J
【问题讨论】:
-
感谢您为我指明方向!复制赋值运算符对我来说是新闻,我可以看到它在不久的将来为我解决了很多问题。
标签: c++ vector copy-constructor dynamic-memory-allocation assertions