2012-07-23 20 views

Odpowiedz

14

w C++ 11 tylko:

class sig 
{ 
    int p_list[4]; 
    sig() : p_list { 1, 2, 3, 4 } { } 
}; 

Pre-11 to nie było możliwe, aby zainicjować tablice inne niż automatycznych i statycznych te w zakresie bloku lub tych statycznych w zakresie przestrzeni nazw.

+0

mam C++ 10. Musiałem więc zrobić to w trudny sposób. Dzięki za wszystkie twoje odpowiedzi. –

+0

Czy sig(): deklarowanie konstruktora? Ta odpowiedź byłaby bardziej pomocna dla początkujących, jeśli pasowałaby do podstawowego układu pytania, abyśmy mogli zobaczyć, jak działa ten konstruktor. Czym jest puste '{}'? – GreenAsJade

+0

Dlaczego nie ma ";" po inicjalizatorze? – GreenAsJade

7

Jak zainicjalizować tablicę?

Korzystanie z normalną listę initialiser składnię:

sig::sig() : p_list{1, 2, 3, 4} 
{ } 

Uwaga, to działa tylko w C++ 11. Wcześniej należy użyć boost::array i zainicjować go wewnątrz funkcji.

3

Jeśli kompilator nie obsługuje C++ 11 inicjalizacji, a następnie trzeba przypisać każde pole Separatly:

p_list[0] = A; 
p_list[1] = B; 
p_list[2] = C; 
p_list[3] = D; 
2

Jeśli bieżący kompilator nie obsługuje jeszcze C++ 11, można zainicjować zawartość wektora przy użyciu standardowych algorytmów i funktory:

class sig 
{ 
public: 
    sig() 
    { 
     struct Functor 
     { 
      Functor() : value(0) {}; 
      int operator()() { return value++; }; 
      int value; 
     }; 
     std::generate(p_list, p_list + 4, Functor()); 
    } 

    int p_list[4]; 
}; 

przykładowe Poprzednie fragment here.

Tak, jest trochę brzydka (przynajmniej dla mnie wygląda brzydko) i nie wykonuje pracy w czasie kompilacji; ale wykonuje pracę, której potrzebujesz w konstruktorze.

Jeśli potrzebujesz innego rodzaju inicjalizacji (inicjalizacja z liczbami parzystymi/nieparzystymi, inicjalizacja z losowymi wartościami, zacznij od wartości anotera, itp ...), musisz tylko zmienić Functor, a to jest jedyna zaleta to brzydkie podejście.

1

można zainicjować składowych tablicy, jak to stosowanie C++ 11 kompilator za pomocą -std = C++ 11 lub -std = gnu ++ 11 opcji

struct student { 
     private : 
       int marks[5]; 
     public : 
       char name[30]; 
       int rollno; 
       student(int arr[], const char *name, int rno):marks{arr[0], arr[1], arr[2], arr[3], arr[4]}{ 
         strcpy(this->name, name); 
         this->rollno = rno; 
       } 
       void printInfo() { 
         cout <<"Name : "<<this->name<<endl; 
         cout <<"Roll No : "<<this->rollno<<endl; 
         for(int i=0; i< 5; i++) { 
           cout <<"marks : "<<marks[i]<<endl; 
         } 
       } 
}; 
int main(int argc, char *argv[]) { 
     int arr[] = {40,50,55,60,46}; 
     //this dynamic array passing is possible in c++11 so use option -std=c++11 
     struct student s1(new int[5]{40, 50, 55, 60, 46}, "Mayur", 56); 
     //can't access the private variable 
     //cout <<"Mark1 : "<<s1.marks[0]<<endl; 
     s1.printInfo();`enter code here` 
} 
Powiązane problemy