将变量声明为“Class”数据类型,而不调用“Class”构造函数?

时间:2010-01-31 09:32:02

标签: c++ class constructor

请原谅我,如果我只是公然地遗漏了某些东西,但我正试图从结构和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部分),所以我不打算在那里调用它。

有没有办法避免这种情况,或者我是否采取了错误的方式?感谢。

编辑:或者我应该设计构造函数来初始化一组棋子?你甚至可以将变量声明为类/对象的数据类型吗?

5 个答案:

答案 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”类中将其设为私有(或至少受保护)是我的建议。