【问题标题】:Is it possible to initialize an array in a member initializer list in C++?是否可以在 C++ 的成员初始化程序列表中初始化数组?
【发布时间】:2015-11-30 04:15:39
【问题描述】:

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

//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...
{}

【问题讨论】:

    标签: c++ arrays initialization member initializer-list


    【解决方案1】:

    您可以使用direct-list-initialization (c++11 起) 作为成员变量。 (不是数组的每个元素。)

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

    LIVE

    【讨论】:

    • 很抱歉,如果未完成的评论在我设法将其删除之前徘徊太久。就目前而言,这是一个不错的答案。
    【解决方案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;
    }
    

    【讨论】:

    • 我同意,我试图设置一个构建环境来测试它,因为我认为我一定遗漏了一些东西。
    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2023-03-19
    • 2011-12-01
    • 2011-07-14
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多