Konwersji listy deklaracyjnej w postaci { 1, 2, 3} dla własnego typu

0

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 };

?

0

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ł ;)

0

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

0

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

0

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 };

1 użytkowników online, w tym zalogowanych: 0, gości: 1