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

Inicjalizacja tablicy będącej składnikiem klasy

Ostatnio zmodyfikowano 2016-12-13 21:06
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Inicjalizacja tablicy będącej składnikiem klasy
» 2016-12-13 00:07:28
Witam. Ostatnio przeglądając forum znalazłem pewien temat. Kod wyglądał tak:
C/C++
#include <iostream>
using namespace std;

class Klasa
{
public:
    int tab[ 5 ];
};



int main()
{
    Klasa tablica[ 100 ];
    tablica[ 0 ].tab = { 1, 2, 3, 4, 5 };
}
No i błąd był przy próbie inicjalizacji składnika "tab". Temat zamknięty, problem rozwiązany, ale ja sie zastanawiam - gdzie jest błąd. Domyślam się, że nie można inicjalizować
tego składnika tab, bo został on już wcześniej stworzony (przy deklaracja 100 elementowej tablicy klasy 'Klasa'), a inicjalizować możemy obiekty tylko w czasie deklaracji np
C/C++
int A[ 5 ] { 1, 2, 3, 4, 5 };
//ale juz nie:
int A[ 5 ];
A[ 5 ] { 1, 2, 3, 4, 5 };
//lub
A = { 1, 2, 3, 4, 5 };
Czy mam rację? Jeśli nie to proszę o wytłumaczenie. Z góry dzięki za odpowiedź :)
P-154838
carlosmay
» 2016-12-13 00:36:30
Czy mam rację?
Poniekąd tak. Jeśli obiekt jest już utworzony, nie można go modyfikować listą inicjalizacyjną (jak twoje przykłady).
Ale możesz to obejść i przypisać do istniejącego obiektu nowy obiekt z listą inicjalizycyjną:
C/C++
int main()
{
    Klasa tablica[ 100 ];
    tablica[ 0 ] = Klasa { 1, 2, 3, 4, 5 };
    for( auto const & el: tablica[ 0 ].tab ) {
        cout << el << ' ';
    }
}
Musisz pamiętać o
operator =
, bo nie dla wszystkich obiektów domyślny będzie działał zgodnie z oczekiwaniem.

edit:
C/C++
#include <iostream>
#include <vector>
using namespace std;

template < class T >
struct Collection {
    using container = std::vector < T >;
   
    container simpleColl;
   
    Collection( std::initializer_list < T > il )
        : simpleColl
    { il }
    {
        ;
    }
};

template < class T >
class myClass {
public:
    using collections = std::vector < Collection < T >>;
   
private:
    collections myCollections;
   
public:
    void appToMyColl( std::initializer_list < T > il )
    {
        this->myCollections.push_back( il );
    }
   
    friend
    std::ostream & operator <<( std::ostream & out, const myClass & my )
    {
        for( auto const & elem: my.myCollections ) {
            for( auto const & myElem: elem.simpleColl ) {
                cout << myElem << ' ';
            }
            cout << '\n';
        }
        return( out );
    }
};

int main()
{
    myClass < int > collections;
    collections.appToMyColl( { 1, 2, 3, 4, 5 } );
    collections.appToMyColl( { 11, 22, 33, 44, 55 } );
    cout << collections << '\n';
}
może tak?
P-154839
michal11
» 2016-12-13 09:27:08
można też przeładować operator (np. przypisania) który przyjmuje initializer_list, wtedy taki zapisa
C/C++
Class tmp { 1, 2, 3 };
tmp = { 4, 5, 6 };

będzie jak najbardziej prawidłowy.
P-154841
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-13 10:34:56
Dzięki. Carlos, ale co oznacza ten zapis
tablica[ 0 ] = Klasa { 1, 2, 3, 4, 5 };
Bo jest tu nazwa klasy i inicjalizacja, ale nie wiem czego, bo przeciez int tab[5] jest składnikiem tej klasy.
P-154842
carlosmay
» 2016-12-13 11:47:07
tablica[ 0 ]
 jest pojedynczym egzemplarzem objektu
Klasa
.
tablica[ 0 ] = Klasa { 1, 2, 3, 4, 5 };
 zastąpienie istniejącego nowym obiektem, zainicjalizowanego listą.
P-154843
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-13 16:29:32
Ale dlaczego tak wygląda inicjalizacja? A co jakbyś w klasie
C/C++
class Klasa
{
    int tab[ 5 ];
    int tab2[ 2 ];
};
miał dwie tablice? Jak to zainicjalizować? Jak byś to napisał?
P-154849
michal11
» 2016-12-13 17:21:59
Klasa()
  : tab{1,2,3,4,5}
  , tab2{1,2,3}
{
}

Edit. ponieważ znaczniki cpp fatalnie formatują listy inicjalizacyjne to musiałem wrzucić w loga :/
P-154858
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-13 18:00:10
@Michal
Tu chodziło o przypisanie do składnika już istniejącego obiektu, innego obiektu, którego składnik inicjalizujemy w tej samej linii. W każdym razie ma to wyglądać (jak wywnioskowałem) tak:
C/C++
class Klasa
{
public:
    int tab[ 5 ];
    int tab2[ 2 ];
};
int main()
{
    Klasa tablica[ 100 ];
    tablica[ 0 ] = Klasa { { 1, 2, 3, 4, 5 }, { 88, 89 } };
}
}
P-154864
« 1 » 2
  Strona 1 z 2 Następna strona