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

Dynamiczna alokacja tablicy obiektów klasy

Ostatnio zmodyfikowano 2016-12-23 12:34
Autor Wiadomość
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:
C/C++
class Mebel
{
    string nazwa;
    int cena;
public:
    Mebel( int price, string name )
    {
        cena = price;
        nazwa = name;
    }
};

class Dom
{
    Mebel * meble; //wskaznik do obiektu klasy Mebel
public:
    int wys, szer;
    string ulica;
    Dom( int ile_mebli );
    Dom();
};

Dom::Dom( int ile_mebli ) //np 10
{
    int cena;
    string nazwa;
    meble = new Mebel[ ile_mebli ] //tu jest blad
    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
C/C++
A::A( int x )
    : obiekt_klasy_B( x )
 Czy tak to działa? Proszę o odpowiedź.
P-155301
mateczek
» 2016-12-22 19:45:25
C/C++
#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; //wskaznik do obiektu klasy Mebel
public:
    int wys, szer;
    string ulica;
    Dom( int ile_mebli );
    Dom();
};

Dom::Dom( int ile_mebli ) //np 10
{
    int cena;
    string nazwa;
    meble = new Mebel[ ile_mebli ]; //tu jest blad
    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 );
    }
}
P-155302
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?
P-155303
mateczek
» 2016-12-22 21:30:40
średnik
P-155307
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?
P-155308
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ą.
P-155318
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
P-155323
« 1 »
  Strona 1 z 1