2010-10-26 14 views
10

Nadal zarabiam moje skrzydła C++; Moje pytanie brzmi, czy mam struct tak:C++ initialize anonimowy struct

struct Height 
{ 
    int feet; 
    int inches; 
}; 

I wtedy niektóre linie tak:

Height h = {5, 7}; 
Person p("John Doe", 42, "Blonde", "Blue", h); 

Lubię inicjalizacji elemencie poprzez klamrami, ale ja wolę powyżej być w jednej linii, w anonimowej strukturze wysokości. Jak mam to zrobic? Moje początkowe naiwne podejście było następujące:

Person p("John Doe", 42, "Blonde", "Blue", Height{5,7}); 

To jednak nie działało. Czy jestem daleko od tego?

+4

To może być tylko przykładem, ale to chyba lepiej, aby zapisać 'Height' jako pojedynczy' dziedzinie inches'. Kiedy potrzebujesz stóp, możesz je zamienić na stopy; O wiele łatwiej jest poradzić sobie z pojedynczą jednostką niż żonglować wieloma jednostkami, zwłaszcza, że ​​tak jak teraz, możesz mieć wiele wartości, które są równe, ale nie mają tej samej reprezentacji (np. '{2, 3}' i '{ 1, 15} "). –

+1

C++ 1x zawiera [jednolitą składnię inicjalizacji] (http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization), która obsługuje coś takiego. Jest całkiem prawdopodobne, że Twój kompilator już to obsługuje. – sbi

+2

Zamiast "Wysokość {5,7}" w konstruktorze Person, podaj '(struct Height) {5,7}' (jeśli przechodzisz przez odwołanie) (lub '& (struct Height) {5,7} 'jeśli podajesz wskaźnik). Zasadniczo przesyłasz listę inicjalizacyjną do żądanego typu. Jest to funkcja C99 +, ale powinna być również dostępna w C++. – Erhhung

Odpowiedz

15

Nie można, przynajmniej nie w dzisiejszym C++; inicjalizacja nawiasów jest częścią składni inicjalizatora i nie może być używana w innym miejscu.

Możesz dodać konstruktora Height:

struct Height 
{ 
    Height(int f, int i) : feet(f), inches(i) { } 
    int feet, inches; 
}; 

To pozwala używać:

Person p("John Doe", 42, "Blonde", "Blue", Height(5, 7)); 

Niestety, ponieważ Height nie jest agregatem, nie można już używać inicjalizacji nawiasów . Inicjowanie wywołania konstruktora jest równie proste:

Height h(5, 7); 
+0

Schludny. Nie wiedziałem, że struktury mogą mieć listy konstruktorów/inicjalizatorów. –

+10

@byte: "struct" to dokładnie to samo co "klasa". Jedyną różnicą jest to, że podstawowe klasy i członkowie są domyślnie publiczne dla 'struct' i private dla' class'. –

4

Standardowy C++ (C++ 98, C++ 03) nie obsługuje tego.

Obsługa g ++ jest rozszerzeniem języka i wydaje mi się, że pamiętam, że C++ 0x go obsługuje. Trzeba sprawdzić składnię rozszerzenia języka g ++ i/lub ewentualnie C++ 0x.

Dla obecnie standardowego C++, po prostu nazwij instancję Height, tak jak już zrobiłeś, a następnie użyj nazwy.

Cheers & HTH.,

+0

Czy jest on automatycznie dostarczany, czy też trzeba zdefiniować konstruktor, który akceptuje argument 'initializer_list'? –

+0

@Ben: nie, nie musisz definiować konstruktora, aby uzyskać składnię C++ 0x. głównym celem jest posiadanie * jednolitej * składni, która działa tak samo w większości sytuacji. sprawdź link [Wikipedia link] (http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization) podany przez @sbi wcześniej.Jeśli chcesz uzyskać szczegóły, najnowsza wersja robocza jest dostępna na [stronach komisji C++] (http://www.open-std.org/jtc1/sc22/wg21/), w formacie PDF. –