Dynamiczna alokacja tablicy obiektów klasy
Ostatnio zmodyfikowano 2016-12-23 12:34
latajacaryba Temat założony przez niniejszego użytkownika |
Dynamiczna alokacja tablicy obiektów klasy » 2016-12-22 19:33:22 Witam. Chcę użyć dynamicznej alokacji, w ten sposób: class Mebel { string nazwa; int cena; public: Mebel( int price, string name ) { cena = price; nazwa = name; } };
class Dom { Mebel * meble; public: int wys, szer; string ulica; Dom( int ile_mebli ); Dom(); };
Dom::Dom( int ile_mebli ) { int cena; string nazwa; meble = new Mebel[ ile_mebli ] for( int i = 0; i < ile_mebli; i++ ) { cout << "nazwa " << i + 1 << " mebla: "; cin >> nazwa; cout << "i cene: "; cin >> cena; meble[ i ]->Mebel( cena, nazwa ); } }
Błąd: ||=== Build: Debug in projektlap2 (compiler: GNU GCC Compiler) ===| C:\C++\projektlap2\main.cpp||In constructor 'Dom::Dom(int)':| C:\C++\projektlap2\main.cpp|34|error: no matching function for call to 'Mebel::Mebel()'| C:\C++\projektlap2\main.cpp|34|note: candidates are:| C:\C++\projektlap2\main.cpp|8|note: Mebel::Mebel(int, std::string)| C:\C++\projektlap2\main.cpp|8|note: candidate expects 2 arguments, 0 provided| C:\C++\projektlap2\main.cpp|3|note: Mebel::Mebel(const Mebel&)| C:\C++\projektlap2\main.cpp|3|note: candidate expects 1 argument, 0 provided| C:\C++\projektlap2\main.cpp|35|error: 'i' was not declared in this scope| C:\C++\projektlap2\main.cpp|32|warning: unused variable 'cena' [-Wunused-variable]| ||=== Build failed: 2 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
Nie wiem również, dlaczego 'i' nie zostało zadeklarowane? Domyślam się, że wynika to z tego, że muszę taki obiekt tablicy typu 'Mebel' musi byc od razu zainicjalizowany konstruktorem. Ok, ale żeby obiekt klasy zainicjalizować w konstruktorze INNEJ klasy, musimy tą definicje umieścić na liście inicjalizacyjnej. np A::A( int x ) : obiekt_klasy_B( x ) Czy tak to działa? Proszę o odpowiedź. |
|
mateczek |
» 2016-12-22 19:45:25 #include <string> #include<iostream> using namespace std; class Mebel { string nazwa; int cena; public: Mebel( int price = 0, string name = "" ) { cena = price; nazwa = name; } void setParametr( int price, string name ) { cena = price; nazwa = name; } };
class Dom { Mebel * meble; public: int wys, szer; string ulica; Dom( int ile_mebli ); Dom(); };
Dom::Dom( int ile_mebli ) { int cena; string nazwa; meble = new Mebel[ ile_mebli ]; for( int i = 0; i < ile_mebli; i++ ) { cout << "nazwa " << i + 1 << " mebla: "; cin >> nazwa; cout << "i cene: "; cin >> cena; meble[ i ].setParametr( cena, nazwa ); } } |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-22 19:55:30 Ok, dzięki, ale jest coś, co mnie zbiło z tropu; Dlaczego nie mogłem zrobić tak, jak było? Czy zawsze przy tworzeniu obiektu musi być on inicjalizowany konstruktorem? Ja konstruktora nie wywoływałem, a nie było zdefiniowanego konstruktora domniemanego. Ty przerobiłeś mój konstruktor na domniemany i dlatego zadziałało (konstruktor zadziałał niejawnie)? I drugie: Dlaczego 'i' nie było (według kompilatora) zadeklarowane? |
|
mateczek |
» 2016-12-22 21:30:40 średnik |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-22 23:27:14 Aha... brak średnika po alokacji. A to pierwsze? :p czy jeśli tworzymy obiekt poprzez dynamiczną alokację to musimy go od razu zdefiniować konstruktorem? |
|
michal11 |
» 2016-12-23 10:22:22 Co to znaczy zdefiniować konstruktorem? Jeżeli tworzysz jakiś obiekt to automatycznie wywoływany jest jego konstruktor. Możesz ew. zarezerwować czystą pamięć na ten twój obiekt ale to już jest ryzykowna zabawa dla osób które naprawdę wiedzą co robią. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-23 12:34:30 Źle to nazwałem. Ale chodziło mi o to co napisałeś. Dzięki. Temat do zamknięcia |
|
« 1 » |