mateuszq Temat założony przez niniejszego użytkownika |
Dynamiczne tworzenie obiektów klas » 2014-04-12 18:12:19 Witam, chciałbym sie dowiedzieć czy moge w poniższy spobób tworzyć obiekty klas (skład klasy nie jest ważny chodzi mi o sam sposob tworzenia nowych obiektów). W funkcji main() tworze sobie wskaźnik do klasy osoba po czym dynamicznie alokuje pamięc i teraz tak, wydaje mi sie że powinienem podać odrazu rozmiar tablicy tych tworzonych dynamicznie obiektów jednak ja tego nie robie i dopeiro potem podczas tworzenia podaje odpowiedni indeks. Niby się kompiluje ale wydaje mi sie, że jest to nie poprawne proszę o jakąs opinie... Moje założenie było takie, że chce w trakcie trwania programu opcjonalnie (jeżeli zajdzie taka potrzeba) tworzyć sobie nowy obiekt. #include <iostream> #include <conio.h>
using namespace std;
class osoba { int wiek; double wzrost; public: osoba( int, double ); ~osoba(); void wpisz(); void wyswietl(); friend osoba tworz(); }; osoba::osoba( int wiekk = 0, double wzrostt = 0 ) : wiek( wiekk ) , wzrost( wzrostt ) { }
osoba::~osoba() { cout << "destruktor" << endl << endl; }
void osoba::wpisz() { cout << "wiek: "; cin >> wiek; cout << "wzrost: "; cin >> wzrost; }
void osoba::wyswietl() { cout << "Wiek: " << wiek << endl; cout << "Wzrost: " << wzrost << endl; }
osoba tworz( int a, double b ) { osoba nowa( a, b ); return nowa; }
int main() { osoba * tab; tab = new osoba; osoba pierwsza( 20, 45.56 ); pierwsza.wyswietl(); tab[ 0 ] = tworz( 20, 1000 ); tab[ 0 ].wyswietl(); tab[ 1 ] = tworz( 100, 100.300 ); tab[ 1 ].wyswietl(); _getch(); return 0; }
|
|
f651144 |
» 2014-04-12 18:19:13 Nie, nie, nie. Trochę pokręciłeś. 1. W tym miejscu: tab = new osoba; tworzysz tablicę jednoelementową, czyli po prostu dynamicznie alokujesz jeden obiekt klasy osoba (o ile alokacja się uda, ale wiem, że w większości książek i uczelni nikt się tym nie przejmuje - taka dygresja). 2. Tu: tab[ 0 ] = tworz( 20, 1000 ); nic nie tworzysz, tylko kopiujesz (przypisujesz). 3. A tu: tab[ 1 ] = tworz( 100, 100.300 ); wykraczasz poza zakres tablicy o 1. |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-04-12 18:29:33 Jest jakas możliwosc napisania takiej funkcji tworzącej obiekt "na zawołanie"? Oczywiscie mógłbym to zrobic na zasadzie takiej ze funkcja tworzy obiekt potem go zwraca i przypisuje do jakiegos obiektu ale nie o to mi chodzi. Może na takim przykładzie. Mam klase osoba, w trakcie pracy programu jest opcja w "menu" "dodaj nową osoba" i chciałbym po wybraniu tej opcji stworzyć TRWALE taki obiekt klasy osoba, a nie tylko chwilowy lokalny obiekt ktory bedzie dostępny w obrębe jakiejś funkcji po czym zniknie |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-04-12 18:33:30 Chciałbym sie też obejsć bez inicjalizacji duzych tablic obiektów, raz bedą mi potrzebne dwa obiekty a raz 100 i inicjalizaując taką tablice przy utworzeniu przypuśćmy tylko dwóch obiektów to będzie marnotrawstwo pamięci |
|
Monika90 |
» 2014-04-12 18:44:33 raz bedą mi potrzebne dwa obiekty a raz 100 |
std::vector<osoba> |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-04-13 10:59:20 dzięki za podpowiedz, przynajmniej teraz wiem za co sie zabrac :) |
|
mateuszq Temat założony przez niniejszego użytkownika |
» 2014-04-13 15:52:08 Jeszcze mam takie pytanie. Tworze sobie jakas liste vector < obiekt *> pierwszy; . . . . pierwszy.push_back( new obiekt );
|
|
RazzorFlame |
» 2014-04-13 19:13:35 vec.push_back( new obiekt( argument, argument, argument...) ); lub: obiekt * obj = new obiekt( argument, argument, argument...); vec.push_back( obj );
Nie zapomnij na końcu usunąć obiektów poprzez delete. |
|
« 1 » 2 |