请原谅我,如果我只是公然地遗漏了某些东西,但我正试图从结构和c转换为类和c ++。
继承人我正在做的事情:
A有“Checkers”课程和“Board”课程。
现在有了结构体,我可以通过以下方式在我的“board.cpp”文件中创建一个Checkers数组:
Checker checkers[2][12]
(每边0和1,每件0-11)
问题是对于类,执行相同的声明将尝试调用“Checkers”构造函数。我收到此错误:“错误:没有匹配函数调用'Checker :: Checker()'”
My Checker构造函数处理初始化单个部分(如果它位于0或1侧,0-11部分),所以我不打算在那里调用它。
有没有办法避免这种情况,或者我是否采取了错误的方式?感谢。
编辑:或者我应该设计构造函数来初始化一组棋子?你甚至可以将变量声明为类/对象的数据类型吗?答案 0 :(得分:5)
您可以创建默认构造函数,也可以使用Checker
指针数组,并通过使用适当的参数动态分配Checker
的构造函数中的每个Board
来初始化它们。在后一种情况下,在分配构造函数之前不会调用它。
答案 1 :(得分:2)
创建默认构造函数。然后使用初始函数。我建议你使用STL矢量。
答案 2 :(得分:1)
问题是对于类,执行相同的声明将尝试调用“Checkers”构造函数。我收到此错误:“错误:没有匹配函数调用'Checker :: Checker()'”
如果已为类定义了参数化构造函数(并且未定义默认构造函数),则编译器将不提供默认构造函数。您还必须编写默认构造函数的版本。
不使用二维数组,而是使用向量向量。
std::vector<std::vector<Checker> > checkers;
答案 3 :(得分:1)
您正在创建一系列检查程序来表示属于每一方的各个检查程序。检查器要求您告知检查器在哪一侧,以及哪个检查器。
为什么你需要知道哪个检查器是哪个?如果玩家走出房间,并且有人将他的两个跳棋交换过来,他会注意到吗?
您可以使用数组语法传递一个构造函数参数,如下所示:
enum Side { White, Black };
class Checker
{
Side side ;
public:
Checker ( Side side ) : side(side) {
}
};
int main()
{
Checker white[12] = { White, White, White, White, White, White, White, White, White, White, White, White, };
Checker black[12] = { Black, Black, Black, Black, Black, Black, Black, Black, Black, Black, Black, Black, };
Checker* both[2] = { white, black };
return 0;
}
多个参数需要复制构造函数,如下所示:
Checker white[12] = { Checker(White,0), Checker(White,1) ...
但我倾向于只使用几个棋盘对象将棋盘添加到棋盘上,代表White,Black,White Queen和Black Queen,除非有很好的理由来跟踪身份。
答案 4 :(得分:0)
要回答这个问题,我真的需要看看“Checker”类的定义。这是一个猜测,但是......
我认为您的Checker类定义了非默认构造函数,但没有默认构造函数。有一个默认的默认构造函数IYSWIM,但只要你自己定义了构造函数,就会禁用编译器提供的隐式默认构造函数。
如果你有......
class Checker
{
public:
Checker (int p) { ... };
};
根据......
的需要,您不能使用默认构造函数Checker checkers[2][12];
相反,试试......
class Checker
{
public:
Checker () { ... };
Checker (int p) { ... };
};
至于使用std :: vector的建议,在这种情况下我不同意。数组是固定大小的,所以使用std :: vector没有任何好处 - 只有额外的复杂性和其他成本。
保留你的C风格数组,但在“Board”类中将其设为私有(或至少受保护)是我的建议。