C++:数独(复制棋盘)

4

我是c++的新手,在做作业(数独)时遇到了问题。

指令说:“你必须创建一个新的板,它是当前板的副本(使用复制构造函数,并使用new从堆中分配板)。”

我尝试过了(在board.cc中编写):

#include "board.h"

// Search for a solution, returns NULL if no solution found
Board* Board::search(void) {
  Board b = new Board(&this);
  ...
  return b;
}

收到错误消息:
lvalue required as unary '&' operand.

我也尝试过:

Board* Board::search(void) {
   Board b;
   Board *b3;
   b3 = &b;
...
   return b3;
}

编译时没有问题,但是运行时也无法正常工作。应该怎么做?真的需要帮助,谢谢!

这里是board.h的一些代码:

class Board {
private:
  Field fs[9][9]; // All fields on board

public:
  // Initialize board
  Board(void) {
    // Uses the default constructor of Field!
  }
  // Copy board
  Board(const Board& b) {
    for(int i = 0; i < 9; i++){
      for(int j = 0; j < 9; j++){
          fs[i][j] = b.fs[i][j];
      }
    }
  }

  // Assignment operator for board
  Board& operator=(const Board& b) {
    if(this != &b){
       for(int i = 0; i < 9; i++){
          for(int j = 0; j < 9; j++){
             fs[i][j] = b.fs[i][j];
          }
        }
     }
     return *this;
   }
   ....

完整的说明可以在这里找到: http://www.kth.se/polopoly_fs/1.136980!/Menu/general/column-content/attachment/2-2.pdf 代码: http://www.kth.se/polopoly_fs/1.136981!/Menu/general/column-content/attachment/2-2.zip

Board b = new Board(&this); 这不对。如果你想使用 "new",你需要将其定义为 Board *b。 - user999040
数独求解器,耶!显式内存处理,呀! - Nick Dandoulakis
2个回答

7

更改:

Board b = new Board(&this);

to:

Board *b = new Board(*this);

另外,如果您正在使用C++11兼容的编译器,我建议您返回std::unique_ptr<Board>或std::shared_ptr<Board>以管理您的新Board实例。它们可以在#include <memory>中找到。 - fronsacqc
这只解决了问题的一部分。我猜测 Board 没有一个以 Board** 为参数的构造函数... - David Rodríguez - dribeas
谢谢,但是我仍然收到错误消息:需要左值作为一元'&'操作数 :( - Ferry
抱歉 - 如@David R所指出,我错过了第二个问题 - 现在已更新。 - Paul R

5
Board b = new Board(&this);

该行代码有两个错误。第一个错误是,如果你使用new分配内存,类型将会是Board *而不仅仅是Board。第二个错误是,如果你想要调用复制构造函数,应该传递指向this所指的元素,而不是this的地址:

Board * b = new Board( *this );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接