2013-05-06 11 views
5

mam:Jak korzystać initializer_list

1) NetBeans 7.3 2) Qt przez Digia v4.8.4. 3) kompilator MinGW.

Czy możesz pomóc mi zainicjować moją tablicę? Niestety nie udało mi się. Rozumiem, że muszę użyć initializer_list. Ale to, co włożyć do moich plików i jak zorganizować wszystko, jest dla mnie zagadką.

Czy będziesz tak miły, aby mi pomóc?

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

Odpowiedz

0

Nie trzeba stworzyć initializer_list, zwłaszcza dlatego, byś potem próbować przypisać to go do tablicy, zamiast zainicjować swoją tablicę z nim - i to byłoby nielegalne. Przeciwnie, można zainicjować tablicę bezpośrednio w liście inicjującej konstruktora, jak zrobić poniżej:

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

Zauważ, że w C++ 11 można także inicjator inline na swojej tablicy, jak to zrobiono poniżej:

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

W danym przypadku, nawet nie trzeba używać initalizer_list wyraźnie ponieważ tablica statyczna może być zainicjalizowane w miejscu definicji, a odbywa się to za pomocą składni w powyższym przykładzie (r równa się zgodność z C++ 11).

Inicjacja shape w liście inicjującej konstruktora jest też możliwe:

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

UWAGA: zwrócić uwagę na fakt, że zostały pominięte dodatkowych nawiasów w próbie.

Powiązane problemy