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

Konstruktrory

Ostatnio zmodyfikowano 2017-03-25 00:32
Autor Wiadomość
MoravenTolo
Temat założony przez niniejszego użytkownika
Konstruktrory
» 2017-03-24 18:58:40
Witam mam takie zadanie, żeby zliczyć stworzone potwory za pomocą zmiennej statycznej oraz metoda statyczna która zwraca ich ilosć i na końcu przestowac jej działanie w funkcji main tworzac i usuwajac potwory w tablicy. I nie wiem o co chodzi z tą tablica? jak wpisać te potwory tworzone konstruktorem do tablicy? Bez tej tablicy wszystko działa i zlicza normalnie.

C/C++
//plik: monster.h
class Monster
{
    string name;
    MonsterType type;
    int attack;
    double health;
    static int amount;
public:
    Monster();
    Monster( const string & name, MonsterType type, int attack, double health );
    ~Monster();
   
    void print();
   
    //setters, getters
    const string & getName() const;
    void setName( const string & name );
    MonsterType getType() const;
    void setType( MonsterType type );
    int getAttack() const;
    void setAttack( int attack );
    double getHealth() const;
    void setHealth( double health );
    int getAmount();
};

Monster * createRandomMonster();

//plik:monster.h
int Monster::amount = 0;

Monster::Monster()
{
    amount++;
    cout << "Zostal stworzony potwor numer " << amount << endl;
}

Monster::Monster( const string & name, MonsterType type, int attack, double health )
    : name( name )
     , type( type )
     , attack( attack )
     , health( health )
{
    amount++;
    cout << "Zostal stworzony potwor numer " << amount << endl;
}

Monster::~Monster()
{
    amount--;
    cout << "Potwor usuniety. Zostalo " << amount << " potworow" << endl;
}

void Monster::print()
{
    cout << "Nazwa potwora: " << name << endl;
    cout << "Typ potwora: " << getTypeName( type ) << endl;
    cout << "Atak potwora: " << attack << endl;
    cout << "Zycie potwora: " << health << endl;
}

int Monster::getAmount()
{
    return amount;
}
//plik main.cpp
int main()
{
    Player p1( "jacek", 12, 13, 15 );
    p1.printPlayerData( p1 );
    cout << endl;
    Monster m1( "igor", MonsterType::Orc, 13, 15 );
    m1.print();
    cout << endl;
    Monster m2( * createRandomMonster() );
    m2.print();
    cout << "zostalo stworzonych " << m1.getAmount() << " potworow";
    cout << endl;
   
    return 0;
}
P-159336
karambaHZP
» 2017-03-24 19:13:02
I nie wiem o co chodzi z tą tablica?
Ale czego dokładnie nie rozumiesz?
Działania tablicy?
Tablica to sekwencyjnie ułożone zmienne danego typu i traktuje się je jak zwykłe zmienne
z innym sposobem dostępu do nich.
P-159341
latajacaryba
» 2017-03-24 22:08:54

I nie wiem o co chodzi z tą tablica? jak wpisać te potwory tworzone konstruktorem do tablicy?

C/C++
int main()
{
    //tworzysz potwory
    Monster m1( "pierwszy", MonsterType::Orc, 13, 15 ); //amount +1
    Monster m2( "drugi", MonsterType::Orc, 12, 11 ); // amount +1
    Monster m3( "trzeci", MonsterType::Orc, 13, 12 ); //amount +1
   
    Monster * wsk;
    wsk = new Monster[ Monster::getAmount() ]; // TO MUSI BYC FUNKCJA STATYCZNA, CZYLI WYWOLYWANA NA RZECZ KLASY, NIE OBIEKTU (klasa::funkcja),nie (obiekt.funkcja)
    // tablica ma teraz wielkosc amount (3)
    wsk[ 0 ] = m1;
    // i tak dalej, wsk[1] i wsk[2]
   
}

Tak więc nie wiem, co chcesz osiągnąć. Możesz też zrobić tablicę WSKAŹNIKÓW do monster i dynamicznie alokować obiekty w tej tablicy:
C/C++
Monster * wsk[ 10 ] // tablica wskaznikow o wielkosci 10 elementow
wsk[ 0 ] = new Monster(...) // w miejsce kropek argumenty konstruktora
P-159348
karambaHZP
» 2017-03-24 22:38:50
wsk = new Monster[ Monster::getAmount() ];

edit:
C/C++
#include <iostream>
#include <vector>
#include <memory>

class A {
    static int n;
    int num;
public:
    A( int num )
        : num
    { num } { ++n; }
    ~A() { --n; }
    static int getN() { return n; }
    const int getNum() const { return this->num; }
};

int A::n = 0;

int main()
{
    std::vector < std::unique_ptr < A >> arr;
    arr.push_back( std::make_unique < A >( 1 ) );
    arr.push_back( std::make_unique < A >( 2 ) );
    arr.push_back( std::make_unique < A >( 3 ) );
   
    std::cout << "licznik danych wynosi " << A::getN() << '\n';
    for( auto const & el: arr ) {
        std::cout << el->getNum() << '\n';
    }
   
    if( arr.size() ) {
        arr.pop_back();
    }
   
    std::cout << "licznik danych wynosi " << A::getN() << '\n';
    for( auto const & el: arr ) {
        std::cout << el->getNum() << '\n';
    }
}
P-159352
Bielan
» 2017-03-25 00:32:04
@karambaHZP, przekombinowałeś, przecież tam nie ma żadnej potrzeby używania wskaźników.


@MoravenTolo,
Tablica nie jest elementem zliczania, ale przechowywania utworzonych już obiektów. Domyślam się, że treścią zadania było przechowywać utworzone obiekty w tablicy. W kwestii tablicy trzeba by było poznać oryginalną treść zadania. W kwestii zliczania:

Aby zrealizować zliczanie stworzonych obiektów wystarczy, że:
1. Klasa będzie posiadać statyczne pole typu całkowitoliczbowego
2. Konstruktor będzie zwiększał zmienną z punktu 1. o jeden.
3. Destruktor będzie zmniejszał zmienną z punktu 1. o jeden.
4. Klasa wystawi statyczną metodę, która będzie zwracać wartość z punktu 1.
P-159360
« 1 »
  Strona 1 z 1