Jump to content
  • 0

Dynamické pole objektů


Andrey

Dotaz

Ahoj, dělám do školy projekt v C++ a v zadání mám body, které musím splnit.

Alespoň jednou bude v projektu implementováno dynamické pole objektů jiné třídy.

Implementace jedné čistě abstraktní třídy.

S těmito dvěma body si jaksi nemohu rady, mohl by mě prosím někdo zasvětit do toho a nejlépe ukázat na nějakém příkladu jak to udělat? :D

Link to comment
Share on other sites

5 odpovědí na tuto otázku

Recommended Posts

  • 2
  • Administrátor

Ahoj!

Čo sa týka tvojho problému dynamicky alokovanej class osobne neodporúčam v rámci školského prostredia využívať vector. Na 90% to nie je cieľ daného zadania, pretože to robí väčšinu práce za teba (v praxi to samozrejme odporúčam).

Dynamicky alokuješ triedu veľmi jednoducho

myObj* object = new myObj[10]

Najskôr si musíš vytvoriť pointer (ukazovateľ) na tvoj objekt (to sa robí pomocou hviezdičky), v tomto kóde je to reprezentované ako premenná "object",  do ktorej si vložíš pole tried "myObj" (pre koreknosť: vloží sa do nej len ukazovateľ na pamäťový priestor kde je alokované naše pole tried, keďže naša premenná je typu pointer na triedu). Takýmto zapísom si triedu dynamicky alokuješ, čo znamená že je alokované na heap, nie na stack.

Nezabudni že až prácu s objektom dokončíš, tak vzhľadom na to že je alokovaná na heap ju musíš vždy uvolniť až s ňou prácu dokončíš, aby si predišiel memory leakom.

delete[] object;

Všimni si tých zatvoriek, tie sa udávajú ak chceš uvolniť pole, keďže v tomto prípade máme pole tried.

 

Čo sa týka tvojho druhého problému ohľadom abstraktných tried.

Všeobecne je v C++ definované, že čistá abstraktná trieda je taká trieda, ktorá neobsahuje žiadne členské premenné a nachádzajú sa v nej iba čisté virtuálne funkcie (metódy), teda metódy bez definície.

Napriklad:

 

class MyClass{
  MyClass(){};
  virtual ~MyClass() {};
  virtual void mymethod() = 0;
};

 

Čisto abstraktná trieda je často krát definovaná ako interface, jej hlavne využitie je na to, aby bola zdedená inými triedami kde sa chovanie metód prepíše, teda je určená na polymorfizmus. V tomto prípade je deklarácia konštruktora nie celkom nutná (kompilátor ho tam aj tak dopíše), avšak odporúča sa kvôli prehľadnosti kódu. Deklarácia deštruktora je nutná, keďže je nutné ho nastaviť ako virtuálny, aby naša trieda spĺňala vlastnosti čistej abstraktnej triedy a hlavne aby sme predišli nepredvídateľnému správaniu.

 

  • Děkuji (+1) 1
Link to comment
Share on other sites

  • 0

Zdar, predpokladám, že tým "Alespoň jednou bude v projektu implementováno dynamické pole objektů jiné třídy" sa myslí, že máš v kóde použiť std::vector.

Čisto abstraktná trieda je taká trieda, ktorá obsahuje iba deklarácie (a nie definície) metód. Ak máš skúsenosť s inými objektovo orientovanými jazykmi (napr. C#, Java, ...), tak to poznáš pod názvom interface.

Link to comment
Share on other sites

  • 0
před 46minutami, DuFF said:

Zdar, predpokladám, že tým "Alespoň jednou bude v projektu implementováno dynamické pole objektů jiné třídy" sa myslí, že máš v kóde použiť std::vector.

Čisto abstraktná trieda je taká trieda, ktorá obsahuje iba deklarácie (a nie definície) metód. Ak máš skúsenosť s inými objektovo orientovanými jazykmi (napr. C#, Java, ...), tak to poznáš pod názvom interface.

pod pojmom dynamicke pole by som si skorej predstavil pole, ktore nie je v stacku, tj. MyObj*[] pole = new MyObj*[42]; alebo jak bola ta hnusna C++ syntax.

 

Abstraktna trieda a interface su dve rozdielne veci.

Interface je prepis, ako ma objekt vypadat, nie co ma robit.
Abstraktna trieda je neuplna implementacia triedy (prip. interfacu).

Link to comment
Share on other sites

  • 0
před 12minutami, Bloodman said:

Abstraktna trieda a interface su dve rozdielne veci.

To máš samozrejme pravdu, ale teraz sa bavíme o čisto abstraktnej triede (pure abstract class), ktorá obsahuje iba dekladárie metód, neobsahuje žiadnu implementáciu a nemá ani žiadne data members. 
C++ nemá (na rozdiel od C#, Javy, ...) interface keyword a rieši sa to práve pomocou týchto čisto abstraktných tried.

Link to comment
Share on other sites

  • 0
On 30. 4. 2021 at 15:24, Lucifer Morningstar said:

Ahoj!

Čo sa týka tvojho problému dynamicky alokovanej class osobne neodporúčam v rámci školského prostredia využívať vector. Na 90% to nie je cieľ daného zadania, pretože to robí väčšinu práce za teba (v praxi to samozrejme odporúčam).

Dynamicky alokuješ triedu veľmi jednoducho


myObj* object = new myObj[10]

Najskôr si musíš vytvoriť pointer (ukazovateľ) na tvoj objekt (to sa robí pomocou hviezdičky), v tomto kóde je to reprezentované ako premenná "object",  do ktorej si vložíš pole tried "myObj" (pre koreknosť: vloží sa do nej len ukazovateľ na pamäťový priestor kde je alokované naše pole tried, keďže naša premenná je typu pointer na triedu). Takýmto zapísom si triedu dynamicky alokuješ, čo znamená že je alokované na heap, nie na stack.

Nezabudni že až prácu s objektom dokončíš, tak vzhľadom na to že je alokovaná na heap ju musíš vždy uvolniť až s ňou prácu dokončíš, aby si predišiel memory leakom.


delete[] object;

Všimni si tých zatvoriek, tie sa udávajú ak chceš uvolniť pole, keďže v tomto prípade máme pole tried.

 

Čo sa týka tvojho druhého problému ohľadom abstraktných tried.

Všeobecne je v C++ definované, že čistá abstraktná trieda je taká trieda, ktorá neobsahuje žiadne členské premenné a nachádzajú sa v nej iba čisté virtuálne funkcie (metódy), teda metódy bez definície.

Napriklad:

 


class MyClass{
  MyClass(){};
  virtual ~MyClass() {};
  virtual void mymethod() = 0;
};

 

Čisto abstraktná trieda je často krát definovaná ako interface, jej hlavne využitie je na to, aby bola zdedená inými triedami kde sa chovanie metód prepíše, teda je určená na polymorfizmus. V tomto prípade je deklarácia konštruktora nie celkom nutná (kompilátor ho tam aj tak dopíše), avšak odporúča sa kvôli prehľadnosti kódu. Deklarácia deštruktora je nutná, keďže je nutné ho nastaviť ako virtuálny, aby naša trieda spĺňala vlastnosti čistej abstraktnej triedy a hlavne aby sme predišli nepredvídateľnému správaniu.

 

Děkuji, tohle mi nejvíce pomohlo :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...