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: #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 int A[ 5 ] { 1, 2, 3, 4, 5 };
int A[ 5 ]; A[ 5 ] { 1, 2, 3, 4, 5 };
A = { 1, 2, 3, 4, 5 };
Czy mam rację? Jeśli nie to proszę o wytłumaczenie. Z góry dzięki za odpowiedź :) |
|
carlosmay |
» 2016-12-13 00:36:30 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ą: 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: #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? |
|
michal11 |
» 2016-12-13 09:27:08 można też przeładować operator (np. przypisania) który przyjmuje initializer_list, wtedy taki zapisa Class tmp { 1, 2, 3 }; tmp = { 4, 5, 6 };
będzie jak najbardziej prawidłowy. |
|
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. |
|
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ą. |
|
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 class Klasa { int tab[ 5 ]; int tab2[ 2 ]; };
miał dwie tablice? Jak to zainicjalizować? Jak byś to napisał? |
|
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 :/ |
|
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: class Klasa { public: int tab[ 5 ]; int tab2[ 2 ]; }; int main() { Klasa tablica[ 100 ]; tablica[ 0 ] = Klasa { { 1, 2, 3, 4, 5 }, { 88, 89 } }; } }
|
|
« 1 » 2 |