2013-05-06 44 views
5

Tôi có:Cách sử dụng initializer_list

1) NetBeans 7.3 2) Qt by Digia v4.8.4. 3) Trình biên dịch MinGW.

Bạn có thể giúp tôi khởi tạo mảng của mình không? Tôi đã thất bại, thật không may. Tôi hiểu rằng tôi phải sử dụng initializer_list. Nhưng những gì cần đưa vào hồ sơ của tôi và cách tổ chức mọi thứ là một điều bí ẩn đối với tôi.

Bạn có tử tế như vậy để giúp tôi không?

Figure.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}       
      } 
    ); 

Trả lời

0

Bạn không cần phải tạo ra một initializer_list, đặc biệt là bởi vì sau đó bạn sẽ phải cố gắng để gán nó nó để mảng của bạn, chứ không phải là khởi mảng của bạn từ nó - và đó sẽ là bất hợp pháp. Thay vào đó, bạn có thể khởi tạo mảng của bạn trực tiếp trong danh sách khởi tạo của nhà xây dựng, như thực hiện dưới đây:

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... 
}; 

Chú ý rằng trong C++ 11 bạn cũng có thể cung cấp một initializer inline cho mảng của bạn, như thực hiện dưới đây:

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... 
} 
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}}       
    }; 
... 

Trong trường hợp cụ thể của bạn, bạn thậm chí không cần phải sử dụng một cách rõ ràng initalizer_list vì mảng tĩnh có thể được khởi tạo ở vị trí của định nghĩa, và điều này được thực hiện thông qua cú pháp trong ví dụ trên (r equires C++ 11 tuân thủ).

khởi của shape trong danh sách constructor khởi tạo có thể quá:

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

LƯU Ý: Chú ý đến thực tế là bạn đã bỏ lỡ ngoặc bổ sung trong thử của bạn.

Các vấn đề liên quan