Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prata, ćwiczenie 4.9

Ostatnio zmodyfikowano 2011-03-29 16:32
Autor Wiadomość
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] ?

C/C++
#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;
   
}
P-29923
DejaVu
» 2011-03-29 15:01:42
Źle tworzysz zmienne - Twój zapis nie jest zgodny ze standardem C++.
P-29924
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?
P-29927
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.
P-29928
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:
C/C++
struct S {
    int x;
    int y;
}

int main() {
    S s[ 2 ] = {
        { 2, - 4 }, // Tu mogę użyć klamer
        { 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:
C/C++
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).
P-29929
« 1 »
  Strona 1 z 1