是否可以在 C++ 的成员初始化程序列表中初始化数组?
Posted
技术标签:
【中文标题】是否可以在 C++ 的成员初始化程序列表中初始化数组?【英文标题】:Is it possible to initialize an array in a member initializer list in C++? 【发布时间】:2015-11-30 04:15:39 【问题描述】:所以,我有这个Game
类,我有一个SDL_Rect
s 数组。如果可能的话,我想在成员初始化器列表中对其进行初始化,而不是在构造函数主体内初始化数组。
//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...
【问题讨论】:
【参考方案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;
【讨论】:
我同意,我试图设置一个构建环境来测试它,因为我认为我一定遗漏了一些东西。以上是关于是否可以在 C++ 的成员初始化程序列表中初始化数组?的主要内容,如果未能解决你的问题,请参考以下文章
C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)