Przypisanie klasy z const'em
Ostatnio zmodyfikowano 2014-11-19 20:23
wiktor12348 Temat założony przez niniejszego użytkownika |
Przypisanie klasy z const'em » 2014-11-19 19:19:09 Witam, Info: Program jest na zaliczenie, ma być tak a nie inaczej bo wymaga tego prowadzący. Konkrety: Mam klasę w której muszę mieć zmienną const. Dodałem jakąś (która zasadniczo nie robi nic), dodatkowo program na działać na pojedynczym wskaźniku, tablicy wskaźników i tablicy wskaźników na obiekt. Wszystko ma być zarządzane dynamiczne. Klasa Class Osoba { ... const int A; public: Osoba( int, int, int ); Osoba(); }
Definicje: Osoba::Osoba() : A( 0 ) { }; Osoba::Osoba( int a, int b, int c ) : Wiek( a ) , Waga( b ) , Wzrost( c ) , A( 0 ) { };
Mam funkcje globalne które mają dynamicznie zarządzać pamięcią. Przykład takiej na tablice wskaźników na obiekt, która dodaje kolejno obiekty: void create( Osoba **& k, int & n ) { Osoba ** tmp = new Osoba *[ n + 1 ]; if( n > 0 ) { for( int i = 0; i < n; i++ ) { tmp[ i ] = k[ i ]; } tmp[ n ] = new Osoba; tmp[ n ]->Set(); delete[] k; } else { tmp[ n ] = new Osoba; tmp[ n ]->Set(); } k = tmp; n++; }
Program się kompiluje nie zauważyłem błędów. Teraz stworzyłem funkcje która robi to samo ale na tablicy wskaźników. void create( Osoba *& k, int & n ) { Osoba * tmp = new Osoba[ n + 1 ]; if( n > 0 ) { for( int i = 0; i < n; i++ ) { tmp[ i ] = k[ i ]; } tmp[ n ].Set(); delete[] k; } else { tmp[ n ].Set(); } k = tmp; n++; }
Najprawdopodobniej muszę przeładować operator, jednak czy mogę to zrobić bez tego? Robię gdzieś głupi i podstawowy błąd. |
|
Monika90 |
» 2014-11-19 19:42:01 Mam klasę w której muszę mieć zmienną const. |
Tego się raczej nie robi, bo uniemożliwa to kompilatorowi automatyczne wygenerowanie operatora przypisania. No chyba że klasa i tak ma być niekopiowalna z takich czy innych przyczyn, to wtedy można. Teraz stworzyłem funkcje która robi to samo ale na tablicy wskaźników.
void create( Osoba *& k, int & n ) { Osoba * tmp = new Osoba[ n + 1 ];
|
Na tablicy wskaźników? new Osoba[ n + 1 ] tworzy tablicę Osób, nie wskaźników. No właśnie nie ma operatora przypisania, najprościej będzie go zdefiniować samemu. Można też alokować niezainicjalizowaą pamięć i tworzyć w niej obiekty za pomocą placement new i konstruktora kopiujacego, ale to jest skomplikowane moim zdaniem. |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2014-11-19 20:01:04 No właśnie nie ma operatora przypisania, najprościej będzie go zdefiniować samemu. |
Ok, czyli wycofam się z tego. Bo mamy nie używać przeładować operatorów a musi być const. Nie wiem jak w inny sposób to połączyć. W pierwszym przypadku funkcji create() nie wyrzuca błędy w drugim tak. Na tablicy wskaźników? new Osoba[ n + 1 ] tworzy tablicę Osób, nie wskaźników. |
Według osoby z którą mam zajęcia to: Osoba * klasa = new Osoba;
Pojedynczy wskaźnik; Osoba * klasa = new Osoba[ 10 ];
Tablica wskaźników. Osoba ** klasa = new Osoba *[ 10 ]; for(..) klasa[ index ] = new Osoba;
Tablica wskaźników na obiekt. Czy to jest poprawne? Nie wiem, ale według mnie dużo rzeczy na tych "zajęciach" jest dziwne... |
|
Monika90 |
» 2014-11-19 20:23:39 Według osoby z którą mam zajęcia to:
Osoba * klasa = new Osoba;
Pojedynczy wskaźnik;
Osoba * klasa = new Osoba[ 10 ];
Tablica wskaźników.
|
W obydwu przypadkach zmienna klasa to jest pojedynczy wskaźnik, w piewszym przypadku ten wskaźnik pokazuje na samotny obiekt klasy Osoba, w drugim pzypadku odnosi się do obiektu, który jest piewszym elementem całej tablicy 10 obiektów klasy Osoba. Tablicy wskaźników tam nigdzie nie ma. |
|
« 1 » |