如何使用初始化器列表

Posted

技术标签:

【中文标题】如何使用初始化器列表【英文标题】:How to use initializer_list 【发布时间】:2013-05-06 20:32:16 【问题描述】:

我有:

1) NetBeans 7.3 2) Digia v4.8.4 的 Qt。 3) MinGW 编译器。

你能帮我初始化我的数组吗? 我失败了,很遗憾。我知道我必须使用 initializer_list。 但是在我的文件中包含什么以及如何组织所有内容对我来说是个谜。

你能帮帮我吗?

图.h

#include <initializer_list>

class Figure: public QObject
    Q_OBJECT
        private:        
                int shape[4][4][4];

Figure.cpp

Figure:: Figure()

std::initializer_list<int> init;
auto init = std::initializer_list<int>
(    
                                    
                            0, 0, 0, 0, 
                            0, 1, 1, 0,
                            0, 0, 1, 0,
                    0, 0, 0, 0
                    ,                        
                            0, 0, 0, 0, 
                            0, 0, 1, 0,
                            0, 1, 1, 0,
                    0, 0, 0, 0
                    ,                        
                            0, 0, 0, 0, 
                            0, 1, 0, 0,
                            0, 1, 1, 0,
                    0, 0, 0, 0
                    ,                        
                            0, 0, 0, 0, 
                            0, 1, 1, 0,
                            0, 1, 0, 0,
                    0, 0, 0, 0                        
            
    );  

【问题讨论】:

【参考方案1】:
...
  private:        
    int shape[4][4][4]                         
                           0, 0, 0, 0, 
                            0, 1, 1, 0,
                            0, 0, 1, 0,
                            0, 0, 0, 0
                    ,                        
                           0, 0, 0, 0, 
                            0, 0, 1, 0,
                            0, 1, 1, 0,
                            0, 0, 0, 0
                    ,                        
                           0, 0, 0, 0, 
                            0, 1, 0, 0,
                            0, 1, 1, 0,
                            0, 0, 0, 0
                    ,                        
                           0, 0, 0, 0, 
                            0, 1, 1, 0,
                            0, 1, 0, 0,
                            0, 0, 0, 0                        
    ;
...

在您的特定情况下,您甚至不需要显式使用initalizer_list,因为可以在定义位置初始化静态数组,这是通过上面示例中的语法完成的(需要符合 C++11 )。

也可以在构造函数初始化列表中初始化shape

...
Figure::Figure(): shape 
                               0, 0, 0, 0, 
                                0, 1, 1, 0,
                                0, 0, 1, 0,
                                0, 0, 0, 0
                        ,                        
                               0, 0, 0, 0, 
                                0, 0, 1, 0,
                                0, 1, 1, 0,
                                0, 0, 0, 0
                        ,                        
                               0, 0, 0, 0, 
                                0, 1, 0, 0,
                                0, 1, 1, 0,
                                0, 0, 0, 0
                        ,                        
                               0, 0, 0, 0, 
                                0, 1, 1, 0,
                                0, 1, 0, 0,
                                0, 0, 0, 0
   
  ...

...

注意:请注意您在尝试中遗漏了额外的括号。

【讨论】:

【参考方案2】:

您不需要创建initializer_list,尤其是因为您会尝试将其分配到您的数组,而不是从中初始化您的数组- 那将是非法的。相反,您可以直接在构造函数的初始化列表中初始化您的数组,如下所示:

Figure::Figure()
    : shape
    
        
            0, 0, 0, 0,
            0, 1, 1, 0,
            0, 0, 1, 0,
            0, 0, 0, 0
        ,
        
            0, 0, 0, 0,
            0, 0, 1, 0,
            0, 1, 1, 0,
            0, 0, 0, 0
        ,
        
            0, 0, 0, 0,
            0, 1, 0, 0,
            0, 1, 1, 0,
            0, 0, 0, 0
        ,
        
            0, 0, 0, 0,
            0, 1, 1, 0,
            0, 1, 0, 0,
            0, 0, 0, 0
        
    

    // Body of the constructor...
;

请注意,在 C++11 中,您还可以为数组提供内联初始化程序,如下所示:

class Figure: public QObject 
    Figure();
private:
    int shape[4][4][4] 
        
            0, 0, 0, 0,
            0, 1, 1, 0,
            0, 0, 1, 0,
            0, 0, 0, 0
        ,
        
            0, 0, 0, 0,
            0, 0, 1, 0,
            0, 1, 1, 0,
            0, 0, 0, 0
        ,
        
            0, 0, 0, 0,
            0, 1, 0, 0,
            0, 1, 1, 0,
            0, 0, 0, 0
        ,
        
            0, 0, 0, 0,
            0, 1, 1, 0,
            0, 1, 0, 0,
            0, 0, 0, 0
        
    ;
;

Figure::Figure() 
    // Body of the constructor...

【讨论】:

以上是关于如何使用初始化器列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在构造函数中使用删除器初始化 std::unique_ptr?

如果您已经有列表视图构建器,如何添加可重新排序的列表视图

windows phone 8 长列表选择器。如何在长列表选择器中添加新项目。目前我正在使用 ItemRealized 事件

如何使用图像创建 JavaScript/HTML5 微调器列表?

如何使用变量初始化新的 Firebase @FirestoreQuery 属性包装器?

如何使用 DVR 会话初始化 Alamofire 管理器?