簡體   English   中英

未定義對構造函數的參數引用

[英]undefined reference to constructor for argument

晚上好

我有一個構造函數的小問題。 我正在嘗試為董事會的不同可能角色構建一棵樹(之后進行DepthFirstSearch)。 在我的節點類構造函數中,我想復制當前的板作為樹的葉子。 但是我收到一個錯誤“未定義對`Board :: Board()'|的引用” 當我嘗試使用我的Board類實例作為Node構造函數的參數時。

如果您對如何正確執行此操作有任何想法,我在聽,我真的看不到任何問題:(

這是我的課程節點:

class Node
{
private :
    Board      state;
    list<Node>  sons;
public :
                Node(Board&);
    void        addNode(Board&);
};

在執行Node構造函數時,我這樣做:

Node::Node(Board& tab)
{
    state = tab;
    sons = NULL;
}

我的董事會課程是:

class Board {

private :
    int**           tab;
    int             nbline;
    int             nbcolumn;
    Position        emptyspot;

public  :
                    Board(int, int, Play&); // initialised with random positions
                    Board(int, int); // just the good size, no values inside. Node::node during constructor.
    void            setValue(Position&, int);
    void            setNbline(int m);
    void            setNbcolumn(int n);
    int             getValue(Position&);
    int             getNbline();
    int             getNbcolumn();
    int             getEmptyline();
    int             getEmptycolumn();
    void            setEmptySpot(Position&);
    Position&       getEmptySpot();

    Board&          operator=(Board& source);
};

編輯:由於人們的詢問,以下是董事會的建設者:

    Board::Board(int m, int n, Play& jeu) : tab{new int*[m]}, nbline{m}, nbcolumn{n}, emptyspot{n-1,m-1}{

       int              x(1);

       for (int i = 0; i < m; ++i){
            tab[i] = new int[n];

            for(int j = 0; j < n; ++j) {
                tab[i][j] = x; x++;}}

       tab[n-1][m-1]=0;
       x=0;

       while (x!=1000)
       {
        int numbers[] = { UP, DOWN, LEFT, RIGHT };
        int length = sizeof(numbers) / sizeof(int);
        int randomNumber = numbers[rand() % length];

        jeu.moves(*this, randomNumber);
        x++;
       }
    }

    Board::Board(int m, int n) : tab{new int*[m]}, nbline{m}, nbcolumn{n}, emptyspot{n-1,m-1}  {
      for (int i = 0; i < m; ++i){
        tab[i] = new int[n];

        for(int j = 0; j < n; ++j) {
            tab[i][j] = 0;}}
}

由於state不在Node的構造函數初始化列表中,因此將使用其默認構造函數創建狀態。 問題是, Board沒有默認構造函數。 要解決此問題,請使用初始化列表。 假設Board具有適當的復制構造函數。

Node::Node(const Board& tab)
    : state(tab)
{
}

我將參數設為const。 我還刪除了列表分配。 我不知道將NULL分配給列表是什么意思,但是如果它是std::list那么它的默認構造函數無論如何都會將其創建為空。

這並不奇怪。 在進行分配之前, Node::Node(Board& tab)狀態是默認初始化的。 由於您未明確進行此操作,因此編譯器將調用未定義的Board::Board() Node::Node()更改為:

Node::Node(Board& tab)
: state(tab)
, sons(NULL)
{
}

請記住,在執行構造函數的主體之前,必須對所有成員進行完全初始化。 因此,包含引用成員或類實例的類(未定義默認/復制構造函數)必須始終通過初始化列表對其進行初始化。

另外,如果您在Board定義了operator=() ,那么還請定義復制構造函數(有關“三則規則”的注意事項 ):

class Board
{
//...

  Board(const Board&)
  {
    //make a copy
  }

};

編輯

我認為董事會的副本構造函數應通過以下方式實現:

Board(const Board& origin)
: tab(NULL)
, nbline(origin.nbline)
, nbcolumn(origin.nbcolumn)
, emptyspot(origin.emptyspot)
{
  this->tab = new int*[this->nbline];

  for (int i = 0; i < m; ++i)
    this->tab[i] = new int[this->nbcolumn];

  //Tab contains int's, so let's do simple memcpy()
  memcpy(this->tab, origin.tab, sizeof(int) * this->nbline * this->nbcolumn);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM