【问题标题】:Beginner C++ questions (School project debugging issues) [closed]初学者 C++ 问题(学校项目调试问题)[关闭]
【发布时间】:2017-07-31 06:46:02
【问题描述】:

对于一项学校作业,我们被指示制作一个井字游戏板。我的程序目前可以运行,但是我遇到了一些问题,我不太确定它们为什么不正确:

class TicTacToe{

private:


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

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

错误是“不能从类内初始化器推导出数组绑定”。当我在数组中放一个“2”时,它就消失了。那么类中的数组需要绑定吗?这是为什么?为什么初始化器不能推导出边界?

我的第二个问题是,同一个项目要求我们在一个名为 Board 的单独类中使用枚举对象来声明赢家/输家/平局。枚举是公开声明的:

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

并且我的井字游戏类有一个 Board 对象作为名为 board1 的数据成员。如何使用我需要做的枚举:

Board::UNFINISHED

而不是

Board.UNFINISHED

此外,即使在我的 Board 实现文件中,我也需要对返回枚举变量的函数执行此操作:

Board::Game Board::gameState()

它在同一个类中,为什么游戏需要由'Board::'进行。我想我对枚举与类一起工作知之甚少。

谢谢!非常感谢任何回答的人。

【问题讨论】:

  • 这是一个问答网站。问题是单数,不是复数。提出的两个问题甚至与您发布的三行(不完整的)代码无关。您可能想查看How to Ask。 (并且编译器错误不是调试,以供将来参考。调试是找出您正在执行的代码没有按预期工作的原因,并且您无法执行无法编译的代码。)
  • 我定义了 QuestioN 和 Answer,而不是 QuestionS 和 Answer。显然你很难区分单数 (ONE) 和复数 (MORE THAN ONE)。在获取有关正确使用本网站的信息时,不要刻薄,您应该花时间阅读tour 并阅读help center 页面以了解该网站的工作原理。它们不是相关的问题;它们是关于同一代码中两个独立问题的三个问题,其中大部分甚至不包含在问题中。是的,singular 实际上意味着 one。谷歌一下。

标签: c++ c++11 enums


【解决方案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() 
    {
        //...
    }
};

【讨论】:

  • 谢谢!说得通。因此,出于同样的原因,函数名前面有 ClassName::,如果返回类型是在类函数中定义的,则返回类型也应该如此。那会是正确的吗?再次感谢!
  • 是的。在class 块中,类的每个成员和类型都在范围内,这意味着您可以直接按名称引用它。在类块之外,您必须使用ClassName::
【解决方案2】:

错误是“不能从类内推导出数组绑定 初始化程序”。当我在数组中放一个“2”时,它就消失了。所以数组 上课需要绑定吗?这是为什么?为什么不能有界限 由初始化器推导出来的?

因为您可以覆盖类构造函数初始化列表中的数组数据。

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

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

我的井字棋类有一个 Board 对象作为数据成员,称为 板 1。如何使用我需要做的枚举: Board::UNFINISHED 而不是 Board.UNFINISHED

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

【讨论】:

  • 嗯。在用户定义的构造函数中初始化数组的可能性如何成为从定义点的初始化列表中的初始化数推断数组大小的反论点?请注意,当数组大小为 2 时,无论如何确定,您的示例都不会编译。
【解决方案3】:

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

你可以参考Declaring an enum within a class了解emuns的用法。

【讨论】:

  • 这与独立数组的定义不同,其大小可以从初始化程序中推断出来,我看不出这种差异的直接原因。你呢?
  • 是的,我同意,区别没有逻辑。但由于它是一个类成员,而且我们无论如何都知道数组大小,所以最好提及数组大小,因为在 c++ 中,内存管理留给我们。
猜你喜欢
  • 2021-02-13
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多