2017-03-10 77 views
-2

对于一个学校任务,我们被指示制作一个TicTacToe委员会。我的程序当前工作,但这里是我遇到了一些问题,我也不太清楚他们为什么不正确:初学者C++问题(学校项目调试问题)

class TicTacToe{ 

private: 


    char user_Turn[] = {'x','o'}; //Array to keep track of turn 

当我试着和我得到一个错误和警告编译。警告是“非静态数据成员的类内初始化是C++ 11扩展”。在课堂上初始化非静态数据成员是不好的做法吗?为什么?

错误是“数组边界不能从在级初始化器推导”。当我在阵列中放置一个'2'时,它就会消失。所以类中的数组需要被绑定?这是为什么?为什么不能通过初始化器推导出界限?

我的第二个问题是,在同一个项目需要我们用一个枚举对象来声明一个胜利者/失败者/名为董事会单独的类画。枚举是公开宣称:

public: 
    enum Game {X_WON, O_WON, DRAW, UNFINISHED}; //enum declaration 

和我的井字游戏类有一个董事会对象称为委员会1的数据成员。为什么使用枚举我需要做的:

Board::UNFINISHED 

,而不是

Board.UNFINISHED 

此外,即使在我局实施的文件,我需要做的这是返回一个枚举变量的函数:

Board::Game Board::gameState() 

它在同一个班级,所以为什么游戏需要由'Board ::'进行。我想我很少理解枚举与类的关系。

谢谢!非常感谢谁回答。

+1

这是一个问题和答案网站。问题是单数,而不是复数。其中两个问题甚至不是关于你发布的三行(不完整)代码。您可能想要查看[问]。 (编译器错误不是*调试*,以供将来参考。调试是找出为什么你正在执行的代码不能按预期工作,并且你不能执行无法编译的代码。) –

+0

我定义了Questio ** N **和答案,而不是问题** S **和答案。显然你很难区分单数(** ONE **)和多个(** MORE THAN ONE **)之间的差异。在获得有关正确使用本网站的信息时,您应该花时间代替[参观]并阅读[帮助]页面以了解该网站的工作方式,而不是嗤之以鼻。他们不是连接的问题;他们是关于同一代码中两个单独问题的三个问题,其中大部分甚至未包含在问题中。是的,**单数**实际上意味着**一个**。去谷歌上查询。 –

回答

1
  1. 你或许可以忽略警告,但可能要检查你是在编译C++ 11或C++ 14

编辑您的编译器设置:错过了有关该错误的部分。看看@Ari0nhh答案

  1. .用于访问实例化类的成员。 enum定义不被认为是一个成员,它更像是一个静态常量,是类定义的一部分。所以你使用::

  2. 当您在class { ... }块之外定义函数时,必须使用类名告诉编译器您正在为该类定义成员。如果您在class { ... }区块内定义它,则不需要。

例如,

class Board 
{ 
public: 
    enum Game {X_WON, O_WON, DRAW, UNFINISHED}; 

    Game gameState() 
    { 
     //... 
    } 
}; 
+0

谢谢!说得通。所以出于同样的原因,函数名称前面有ClassName ::,如果返回类型是在类函数中定义的,那么返回类型也应该如此。这是正确的吗?再次感谢! – maylay97

+0

是的。在'class'块内,每个类的成员和类型都在范围内,这意味着你可以直接引用它。在类块之外,你必须使用'ClassName ::'。 – smead

0

错误是“数组边界不能从在级 初始化推导”。当我在阵列中放置一个'2'时,它就会消失。那么在类中需要绑定数组 ?这是为什么?为什么不能通过初始值设定项推导出界限 ?

因为您可以重写类构造函数初始值设定项列表中的数组数据。

public: 
TicTacToe() : user_Turn({'x','o','d', 'e'}) {}; 

所以,你必须指定数组的大小,或使用std::string/std::vector

和我的TicTacToe类有一个Board对象作为数据成员,名为 board1。为什么使用枚举我需要做的: 局:: UNFINISHED和

因为UNFINISHED枚举成员在Board类命名空间中声明不Board.UNFINISHED。这不是班级成员,因此您不能使用.运营商。

+0

嗯。在用户定义的构造函数中如何初始化数组的一个反参数以从定义点的初始化程序列表中的初始值设定项的数目来推断数组的大小?请注意,当数组大小为2时,无论如何确定,您的示例都不会编译。 –

0

第一个问题的答案是,如果您使用的是数组,则应在声明时给出数组的大小。如果您在声明时不确定数组大小,请使用List。 你可以参考这个就知道名单是如何工作的C++ http://www.cplusplus.com/reference/list/list/

可以参考Declaring an enum within a class为emuns澄清的使用。

+0

这与独立数组的定义不同,后者的大小可以从初始值设定项中推断出来,我没有看到差异的直接原因。你做? –

+0

是的,我同意,差异没有逻辑。但是因为它是一个类的成员,而且我们无论如何都知道数组的大小,所以最好提及数组大小,就像在C++中一样,内存管理留给我们。 – Chandini