【问题标题】:C++ - Initializing an empty array on classC++ - 在类上初始化一个空数组
【发布时间】:2014-10-24 16:53:33
【问题描述】:

我在初始化一个空数组时遇到了一些麻烦,或者我这样称呼它,在一个类中。基本上我想用 0 填充一个二维数组。

这是我的代码:

Board.cpp

#include "Board.h"
#include <string>
#include <iostream>
#include "Player.h"

using namespace std;

Board::Board()
: _board{ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }
{
}

void Board::drawBoard()
{
    for (int i = 0; i < 4; i++){
        for (int j = 0; j < 4; j++){
            if (i == 0 && j == 0){
                cout << " ";
            }
            else if (i == 0){
                cout << " " << j << " ";
            }
            else if (j == 0){
                cout << i;
            }
            else {
                if (_board[i][j] == 0)
                    cout << "| " << "|";
                else
                    cout << "|" << _board[i][j] << "|";
            }
        }
        cout << endl;
    }
}

void Board::playerInput(char input)
{
}

这里是 Board.h:

#pragma once
#include <string>
#include <iostream>

class Board
{
public:
    Board();
    void drawBoard();
    void playerInput(char input);


private:
    char _board[3][3];
    char _input;
};

这是初始化数组的正确方法吗?我读了一些文章,但这让我更加困惑。 如果我听起来很愚蠢,我很抱歉。但我需要你的帮助。 谢谢。

【问题讨论】:

  • 你遇到了什么麻烦?请说明问题。
  • 我收到此错误:“错误 2 错误 C2536:'Board::Board::_board':无法为数组 c:\users\rlngstrdrgntr\documents\visual studio 2013\projects\ 指定显式初始化程序项目1\项目1\board.cpp 10 1 项目1 "
  • 它仍然给我错误:“错误:预期声明”。
  • 请注意,您正在越界访问数组。您的循环循环次数过多。

标签: c++ arrays


【解决方案1】:

根据您的编译器,您应该能够做到这一点(注意使用括号而不是方括号):

Board::Board()
: _board( { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } )
{
}

参考:https://stackoverflow.com/a/2409882/1932930

看起来您正在使用 VS2013。看起来VS2013支持它。参考:http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

【讨论】:

  • 是的,我正在使用 vs2013,它给了我 4 个错误:错误 1 ​​错误 C2536:'Board::Board::_board':无法为数组指定显式初始化程序 2 IntelliSense:只有 '()' 是允许作为数组成员“Board::_board”的初始值设定项 3 IntelliSense:预期为 ';' Project1 4 IntelliSense:需要声明
【解决方案2】:

你需要做的就是值初始化数据成员:

Board::Board() : _board() {}

这将对_board的所有元素进行零初始化,也适用于C++03。

【讨论】:

    【解决方案3】:

    juanchopanza使用的方法是c++11当前设置的 但是,我建议进行一些小的更改。如果所有默认构造函数都在初始化数组,我会在头文件中初始化它。像这样

    #pragma once
    #include <string>
    #include <iostream>
    
    class Board
    {
    public:
        Board()=default; //becomes compiler constructed 
        void drawBoard();
        void playerInput(char input);
    
    
    private:
        char _board[3][3]{};//added {} here
        char _input;
    };
    

    这种方式在调用构造函数之前初始化数组,并且构造函数由编译器生成。 这里的优点是您需要的代码更少,并且如果您愿意,它可以扩展为额外的构造函数。

    例如:

    如果你添加

    Board(char 输入) 用于输入 所需要的只是:

    Board(char input)
    {
       _input=input;// no need to repeat initialization code for _board array
    
    }
    

    【讨论】:

    • +1,这实际上是个好主意(但我怀疑 OP 的编译器是否支持这一点。)
    • OP 的代码和 juan 的代码都在程序执行的同一点初始化数组。
    • 什么是OP?是的“但我怀疑 OP 的编译器是否支持这一点”是真的,许多编译器尚未完全实现 c++11。
    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多