Prata, ćwiczenie 4.9
Ostatnio zmodyfikowano 2011-03-29 16:32
born2fly Temat założony przez niniejszego użytkownika |
Prata, ćwiczenie 4.9 » 2011-03-29 12:19:48 Witam.
Podczas kompilacji programu pojawiają się ostrzeżenia:
"warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x".
Czy dobrze tworzę zmienne koszyk[0], koszyk[1], koszyk[2] ?
#include <iostream> #include <string> using namespace std;
struct Batonik { string marka; float waga; int kalorie; };
int main() { Batonik * koszyk = new Batonik[ 3 ]; koszyk[ 0 ] = { "Mocha Munch", 2.3, 350 }; koszyk[ 1 ] = { "Mars", 4.5, 605 }; koszyk[ 2 ] = { "Snickers", 6, 806 }; cout << koszyk[ 0 ].marka << ", \t" << koszyk[ 0 ].waga << ", \t" << koszyk[ 0 ].kalorie << endl; cout << koszyk[ 1 ].marka << ", \t\t" << koszyk[ 1 ].waga << ", \t" << koszyk[ 1 ].kalorie << endl; cout << koszyk[ 2 ].marka << ", \t" << koszyk[ 2 ].waga << ", \t" << koszyk[ 2 ].kalorie << endl; delete[] koszyk; return 0; }
|
|
DejaVu |
» 2011-03-29 15:01:42 Źle tworzysz zmienne - Twój zapis nie jest zgodny ze standardem C++. |
|
ison |
» 2011-03-29 16:24:50 16|warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x|
czyli ten zapis jest już zgodny z c++0x? |
|
DejaVu |
» 2011-03-29 16:30:28 Niezupełnie - ten zapis w C++0x umożliwia inicjalizację obiektu konkretnymi danymi w czasie jego tworzenia, niemniej jednak wymaga to oprogramowania dodatkowego konstruktora.
/edit:
Choć być może i wywoła się w C++0x konstruktor dla takiego przypadku - na razie jeszcze nie koduję w nowym standardzie więc nawet nie sprawdzę, a czytałem go pobieżnie. |
|
hashedone |
» 2011-03-29 16:32:20 Tak. Ściślej mówiąc w C++ do wersji 0x można było użyć zapisu przypisania z klamrami tylko w momencie tworzenia obiektu, np tak: struct S { int x; int y; }
int main() { S s[ 2 ] = { { 2, - 4 }, { 8, - 24 } }; }
W C++0x zapis klamrowy jest traktowany w inny sposób - jako normalny typ danych, możesz więc napisać funkcję, którą wywołuje się np. tak: foo( { 1, 2, 3, 4 }, { 5, 6, 7, 8 } );
Tak wiec w momencie kiedy przypisujesz takie klamerki do obiektu, najpierw wywoływany jest konstruktor tego obiektu opierający się właśnie o te klamry (nie pamiętam jak się ten typ danych miał nazywać), a następnie przenoszone jest wszystko do zmiennej (jako że tworzony jest tylko obiekt tymczasowy będący prostą strukturą danych, automatycznie generowany jest operator= oparty o semantykę przenoszenia - w skrócie nie wykonuje się żaden konstruktor kopiujący). ===EDIT=== DejaVu - taki konstruktor jest tworzony automatycznie dla prostych struktur danch;) (czyli takich, które zawierają wyłącznie proste struktury danych, oraz trywialny konstruktor). |
|
« 1 » |