【问题标题】: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}                        
            }
    );  

【问题讨论】:

    标签: c++ qt c++11


    【解决方案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...
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        相关资源
        最近更新 更多