C++ 使用另一个对象作为构造函数中的参数创建对象

C++ 使用另一个对象作为构造函数中的参数创建对象,c++,object,constructor,C++,Object,Constructor,因此,我正在制作一个程序,可以找到一个拼字游戏(如果你不知道它是什么,用谷歌搜索它)中所有可能的单词(由字典定义)。总之,我有3个类/对象:一本字典、一个游戏板和bogglegame。bogglegame应该会在字典和游戏板上找到所有合法的单词。我的bogglegame构造函数看起来像 BoggleGame::BoggleGame(字典词典yin,GameBoard-gameboardIN) 字典和游戏板的contsrtutors如下所示 Dictionary::Dictionary(将单词设置

因此,我正在制作一个程序,可以找到一个拼字游戏(如果你不知道它是什么,用谷歌搜索它)中所有可能的单词(由字典定义)。总之,我有3个类/对象:一本字典、一个游戏板和bogglegame。bogglegame应该会在字典和游戏板上找到所有合法的单词。我的bogglegame构造函数看起来像

BoggleGame::BoggleGame(字典词典yin,GameBoard-gameboardIN)

字典和游戏板的contsrtutors如下所示

Dictionary::Dictionary(将单词设置为dictionaryin,未签名的maxLengthIN)
GameBoard::GameBoard(矢量gamestateIN,未签名boardSizeIN)

当我尝试编译时,我得到一个错误,上面写着“错误:调用'Dictionary::Dictionary()时没有匹配的函数”

我希望能够将dictionary和gameboard对象从main传递到构造函数中,并将它们存储为BoggleGame对象的私有成员,从而使BoggleGame对象成为2个对象的对象

编辑:过帐代码

BoggleGame的构造函数

#include "BoggleGame.h"

BoggleGame::BoggleGame(Dictionary dictionaryIN, GameBoard gameboardIN)
{
    dictionary = dictionaryIN;
    gameboard = gameboardIN;
}

#pragma一次
#包括“Dictionary.h”
#包括“GameBoard.h”
班级猜谜游戏
{
公众:
BoggleGame(字典词典词典词典,GameBoard gameboardIN);
void foundWord(字符串wordIN);
字符串查找单词(字符串w、无符号行、无符号列);
set getTheFoundWords(){return foundWords;}
布尔指令(字符串字);
bool isofboard(无符号行、无符号列);
bool usedfile(无符号行、无符号列);
向量getTheGameBoard(){gameboard.getGameBoard();}
私人:
字典;
游戏板游戏板;
设置单词;
};

#pragma一次
#包括
#包括
#包括
#包括
使用std::set;
使用std::string;
使用std::vector;
类词典
{
公众:
字典(设置单词sindictionaryin,无符号maxLengthIN);
布尔指令(字符串字);
void foundWord(字符串wordIN);
字符串查找单词(字符串w、无符号行、无符号列);
无符号getMaxLength(){return maxLength;}
私人:
在字典中设置单词;
无符号最大长度;
设置单词;
};

#pragma一次
#包括
#包括
使用std::string;
使用std::vector;
类游戏板
{
公众:
GameBoard(矢量gamestateIN,未签名的boardSizeIN);
bool舷外(无符号行、无符号列);
bool getTileUseState(无符号行,无符号列){返回usedfiles.at(行).at(列);}
void setTileUsed(无符号行、无符号列);
vector getGameBoard(){返回游戏状态;}
无符号getSize(){return boardSize;}
向量getUsedTiles(){return usedTiles;}
string readTile(无符号行,无符号列){返回gamestate.at(行).at(列);}
void previousState(vector previous){usedfiles=previous;}
私人:
载体配子状态;
矢量文件;
未签名的板大小;
};

也许这是在类BoggleGame中声明字典对象的方式

假设你做了这样的东西:

班级猜谜游戏{

私人: 字典dico

}

在这种情况下,如果构造函数Dictionary::Dictionary()不存在,将出现编译错误

因此,我认为,你的问题的解决方案应该是:

  • 声明字典类中没有参数的构造函数
  • 将dico声明为指针(这意味着Dictionary*dico)

但是如果您发布代码会更好。

错误在于
BoggleGame
的构造函数中。您没有
字典
的默认构造函数。您可以改为在构造函数中使用初始化列表:

BoggleGame::BoggleGame(Dictionary _dictionary)
    : dictionary{_dictionary}
或者,为
字典
提供默认构造函数:

Dictionary() = default;
Dictionary() { }

出现错误的原因是
字典
是默认构造的。将新值赋给
字典
时,使用的是复制赋值运算符。通过使用构造函数初始化列表,可以直接初始化字典。证明:

BoggleGame::BoggleGame(Dictionary _dictionary)
{
    dictionary = _dictionary;
}

Default.
Copy assignment.

BoggleGame::BoggleGame(Dictionary _dictionary)
    : dictionary{_dictionary}
    {
    }

Copy constructor.

正如您所看到的,差异很大。

您可以发布给出错误的行吗?您正在尝试调用某个地方的默认ctor(无论是哪一行
Dictionary::Dictionary()
所指),但是您有一个用户定义的ctor,因此,它会抑制默认对象的生成。是的,这将解决我的编译错误,但对我的问题没有好处,因为我已经创建了一个主要的dictionary对象,并将其传递到BoggleGame的构造函数中。在这种情况下,只需创建一个没有主体的字典默认构造函数,并将其保持如下状态。好吧,现在似乎可以修复我的编译错误,看看它是否符合我的要求(或者至少是接近它的要求),如果这样做行得通,我假设GameBoard也有类似的功能?我也得到了同样的错误。
BoggleGame::BoggleGame(Dictionary _dictionary)
    : dictionary{_dictionary}
Dictionary() = default;
Dictionary() { }
BoggleGame::BoggleGame(Dictionary _dictionary)
{
    dictionary = _dictionary;
}

Default.
Copy assignment.

BoggleGame::BoggleGame(Dictionary _dictionary)
    : dictionary{_dictionary}
    {
    }

Copy constructor.