Mam proste pytanie czy w C++ mam możliwość uzyskania konwersji listy deklaracyjnej w postaci { 1, 2, 3} dla własnego typu, chodzi mi o taki efekt:
MyClass myClass = { 0 , 2, 3 };
?
Mam proste pytanie czy w C++ mam możliwość uzyskania konwersji listy deklaracyjnej w postaci { 1, 2, 3} dla własnego typu, chodzi mi o taki efekt:
MyClass myClass = { 0 , 2, 3 };
?
Starszy C++ pozwala stosować listy inicjujące do struktur lub klas. Jednak w przypadku klas, muszą one spełniać wymagania jak dla TSD, aby dało się inicjować je w taki sposób. Jeśli klasa nie spełnia zasad jak dla TSD (np. std::vector lub boost::array), wtedy te listy na nich nie działają.
*TSD - Tradycyjna struktura danych
C++11 wiąże koncepcję inicjowania list z typem zwanym std::initializer_list. To pozwoli konstruktorowi lub metodom na podanie takich list jako argumentów. Na przykład:
class JakasKlasa
{
public:
JakasKlasa(std::initializer_list<int> list);
};
Możesz spróbować, ale wątpię, żeby kompilator to obsłużył ;)
Przed C++ 11 mieliśmy tylko aggregate initialization
. W C++11 doszło std::initializer_list
.
http://en.cppreference.com/w/cpp/language/aggregate_initialization
http://en.cppreference.com/w/cpp/utility/initializer_list
class type (typically, struct or union), that has
- no private or protected members
- no user-provided constructors (explicitly defaulted or deleted constructors are allowed)
- no base classes
- no virtual member functions
- no brace-or-equal initializers for non-static members
Toć to ubóstwo :P
Zależy od wersji kompilatora. Takie coś można zrobić od zawsze:
class MyClass
{
public:
int a, b, c;
};
MyClass myClass = { 0, 2, 3 };
Ale już wystarczy dodać niestandardowy konstruktor do klasy, a wyskoczy błąd:
C2552: 'myClass' : non-aggregates cannot be initialized with initializer list
'MyClass' : Types with user defined constructors are not aggregate
W kompilatorach spełniających standard C++11 można wyczyniać cuda używając initializer_list
, i wtedy nie ma ograniczeń:
class MyClass
{
public:
MyClass(initializer_list<int> args)
{
for (int i : args)
cout << i;
}
};
MyClass myClass = { 0 , 2, 3 };