IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: pole abstraktnej triedy

Aktivity
Avatar
sphex
Člen
Avatar
sphex:27.12.2016 11:04

Dobrý deň, potreboval by som pomoc s touto hrou, musím z tohto urobiť aby na obrazovke boli 3 lopty a postupne bud pribudali alebo ubudali.Skúšal som to spraviť cez pole, ale keby ho chcem inicializovať cez triedu engine tak to nejde pretože tam inicializujem iba jeden objekt aj to abstraktný a pole z abstraktných objektov nešlo spraviť. Viete mi poradiť nejaký spôsob ako pokračovať?

//trieda HraLopta.cpp kde sa všetko ininicializuje
#include "HraLopta.h"
#include "SDLSystem.h"

HraLopta::HraLopta()
        :aHraciaPlocha(new SDLSystem(800, 600)),
        aLopta(new Lopta(aHraciaPlocha)),
        aHra(new Engine(aLopta, aHraciaPlocha))
{
}

HraLopta::~HraLopta()
{
        delete aHra;
        delete aLopta;
        delete aHraciaPlocha;
}
// trieda Engine.cpp
#include <cstdio>
#include "Engine.h"

void Engine::zobrazSkore()
{
        if (aHraciaPlocha)
        {
                char buf[100];
                sprintf(buf, "Pocet bodov: %d", aSkore);
                aHraciaPlocha->zobrazData(buf);
        }
}

void Engine::aktualizuj()
{
        if (aHraciaPlocha && aObjekt)
        {
                if (aObjekt->aktualizujSa(aHraciaPlocha->dajCas()))
                {
                        aHraciaPlocha->zmaz();
                        aObjekt->zobrazSa();
                        aHraciaPlocha->update();
                }
        }
}

void Engine::spracujVstup(int x, int y)
{
        if (aObjekt && x >= 0)
        {
                int body = -aObjekt->dajBody();
                if (aObjekt->zasah(x, y))
                        body = -body;
                aSkore += body;
                zobrazSkore();
        }
}

Engine::Engine(IObjekt * objekt, ISystem * hraciaPlocha)
        :aObjekt(objekt), aHraciaPlocha(hraciaPlocha),
        aSkore(0)
{
}

Engine::~Engine()
{
}

void Engine::start()
{
        if (!aHraciaPlocha) return;
        int x(-1), y(-1);
        zobrazSkore();
        do
        {
                aktualizuj();
                spracujVstup(x, y);
        } while (aHraciaPlocha->vstup(x, y));

}
 
Odpovědět
27.12.2016 11:04
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na sphex
Martin Dráb:27.12.2016 14:29

Nějak nevidím deklaraci toho pole abstraktních tříd, ale obecně se dá říci toto:

Musíš deklarovat pole ukazatelů (ať už raw, nebo skrzt. smart pointery) na tu abstraktní třídu. Jednak tím v podstatě zajistíš fungování polymorfismu (při alokaci na zásobníku virtuální metody nefungují), druhak tím vyřešíš inicializaci. Potom akorát každý prvek toho pole inicializuješ nějak takto:

pole[i] = new KonkretnejsiPotomekAbstraktniTridy(...);
Nahoru Odpovědět
27.12.2016 14:29
2 + 2 = 5 for extremely large values of 2
Avatar
sphex
Člen
Avatar
sphex:28.12.2016 9:53

Aha, ďakujejm a ako by som mal spraviť konštruktor pre to pole ak som si na to spravil vlastnu triedu Pole.h a keď robím Pole.cpp nechce mi to nič zobrať

A ešte neviem ako by som mal spraviť metodu pridajPrvokDoPola tak aby mi to vytváralo novú loptu a pridalo ju do pola ak na tom prvku ešte žiadna nie je

// trieda Pole.h
#pragma once

class Pole {
private:
        int maxPocet = 10;
        IObjekt *pole[10];

public:
        Pole();
        ~Pole();

};
//trieda Pole.cpp
#include "Pole.h"

Pole::Pole()
{

}

Pole::~Pole()
{
}
 
Nahoru Odpovědět
28.12.2016 9:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.