在C++中,是否可以在成员初始化列表中初始化数组?

5

所以,我有一个Game类,还有一个SDL_Rect数组。如果可能的话,我想在成员初始化列表中对其进行初始化,而不是在构造函数体内初始化数组。

//Game.h
#pragma once

class Game {
public:
  Game(SDL_Window* window, SDL_Renderer* renderer);

private:
  SDL_Rect down[4];
};

// Game.cpp
#include "Game.h"

Game::Game(SDL_Window* window, SDL_Renderer* renderer){
  down[0] = {1,4,31,48};
  down[1] = {35,5,25,47};
  down[2] = {65,4,31,48};
  down[3] = {100,5,26,47};
}

我希望能做类似于这样的事情:
// Game.cpp
Game::Game()
: down[0]({1,4,31,48};
  // etc, etc...
{}
2个回答

5
你可以使用直接列表初始化(自C++11起)来初始化成员变量。(不是数组的每个元素。)
Game::Game()
: down {{1,4,31,48}, {35,5,25,47}, {65,4,31,48}, {100,5,26,47}}
{}

直播


抱歉,如果那个未完成的评论在我成功删除之前停留了太久。就目前而言,这是一个可以接受的答案。 - Cheers and hth. - Alf

2

没有问题。

所以这是一个令人困惑的问题。

struct Rect { int x, y, width, height; };

struct Game
{
    Rect down[4] =
    {
        {1,4,31,48},
        {35,5,25,47},
        {65,4,31,48},
        {100,5,26,47},
    };
};

#include <iostream>
using namespace std;
auto main() -> int
{
    Game g;
    for( Rect const& rect : g.down )
    {
        cout << rect.x << ' ';
    }
    cout << endl;
}

为了使用std::array代替原始数组,这通常是一个好主意,并且让代码在g++中编译,需要在初始化器中添加一组内部括号,像这样:

std::array<Rect, 4> down =
{{
    {1,4,31,48},
    {35,5,25,47},
    {65,4,31,48},
    {100,5,26,47}
}};

如果有必要,可以将初始化放在构造函数的成员初始化列表中(而不是上面所述的方式),如下所示:

#include <array>

struct Rect { int x, y, width, height; };

struct Game
{
    std::array<Rect, 4> down;

    Game()
        : down{{
            {1,4,31,48},
            {35,5,25,47},
            {65,4,31,48},
            {100,5,26,47}
        }}
    {}
};

#include <iostream>
using namespace std;
auto main() -> int
{
    Game g;
    for( Rect const& rect : g.down )
    {
        cout << rect.x << ' ';
    }
    cout << endl;
}

我同意,我一直在尝试建立一个构建环境来测试它,因为我觉得我肯定漏掉了什么。 - markshancock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接