• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Polecenie - dylemat - C++

Object Storage Arubacloud
0 głosów
287 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez fruczka Użytkownik (570 p.)
Cześć. Mam małe pytanko. Jaka jest różnica w kodzie pomiędzy dwoma poleceniami? Dużo jest do zmiany czy niewiele?
1. Stwórz tablicę obiektów roślin o różnych klasach.
2. Stwórz kolekcję typu vector roślin o różnych klasach.

Pierwsze zadanie zrobiłem, jednak nie wiem, jak wykronać drugie. Czy wystarczy tablicę z zadania pierwszego (w int main głównym) zamienić na vector<int>VectorI(konstruktor/y) i będzie dobrze?
Z góry przepraszam za być może banalne lub błahe pytania, jednak chciałbym się nauczyć i zrozumieć działanie kodu.

Pozdrawiam. :)

1 odpowiedź

–1 głos
odpowiedź 20 czerwca 2018 przez profesorek96 Szeryf (91,420 p.)
Moment, masz np dwie klasy Zwierze i Roślina. Ty teraz chcesz stworzyć tablice która będzie zawierała obiekty klasy Zwiewrze lub Roślina ?

Czy chodzi ci o stworzenie tablicy zawierającej obiekty jednej klasy ? To pierwsze nie możliwe w C++ zaś drugie jak najbardziej.
komentarz 20 czerwca 2018 przez fruczka Użytkownik (570 p.)
W tym momencie chciałbym na podstawie pierwszego ćwiczenia, w którym zrobiłem tablicę roślin o różnych klasach, stworzyć wektor również o różnych klasach, a obiekty mogą być dziedziczone, tutaj nie ma jakichś wymagań w poleceniu. Także chyba... chciałbym poprosić o jakąś receptę, przepis lub pomysł, w jaki sposób można to w kodzie przedstawić.
PS. W drugim zadaniu muszą być różne klasy. Gdyby były jednakowe, to jakoś można by było to wykonać ;) Czy po prostu tutaj zrobić jakieś dwie tablice dynamiczne i oddzielić je, że jeden wektor ma A, B, C, a powiedzmy drugi wektor ma A, B, C. Właśnie w tym jest dylemat, bo to polecenie jest dość proste logicznie myśląc, tylko nie wiem, jak można zrobić taką kolekcję w wektorze, kilka konstruktorów?
2
komentarz 21 czerwca 2018 przez Szfierzak Gaduła (3,750 p.)

@profesorek96, jedno i drugie jest możliwe, tylko pierwsze pod warunkiem dziedziczenia, czy będzie ono logiczne z punktu widzenia natury, to zależy, choć raczej nie, ale może być poprawne i wykonywane w C++

@fruczka

Jeżeli masz tablice obiektów to pewnie robisz ją mniej więcej tak :

Nazwa_klasy nazwa_tablicy[rozmiar_tablicy] ;

Jeżeli chcesz mieć vector obiektów, to nie rób wektora intów, tylko zamiast int wpisz w deklaracji nazwę klasy, a konstruktor domyślny zrobi resztę (zakładam, że korzystasz z vectora z stl)

vector<Nazwa_klasy> nazwa_zmiennej_typu_vector;

Dodajesz obiekty do wektora za pomocą np. funkcji insert, lub push_back, dostęp do obiektów masz jak w tablicy, za pomocą [] lub funkcji at. Rozmiar wektora, czyli ilość dodanych elementów sprawdzasz za pomocą funkcji size(). Przykład:

vector<Roslina> roslinki;
roslinki.push_back(kaktus);
Roslina R=roslinki[0];
int rozmiar=roslinki.size();

 

komentarz 21 czerwca 2018 przez fruczka Użytkownik (570 p.)

Hmm już wiele się rozjaśniło :) Bardzo dziękuję za pomoc. Zostało właściwie jedno do zrozumienia, mianowicie... jedna linijka kodu jest błędna, próbowałem na różne sposoby zadeklarować do wektora jakąś klasę, jednak coś jeszcze nie wychodzi.
Tutaj tkwi błąd, którego nie potrafię zrozumieć (linijka z push_back):
 

int main()
{
    cout << "Tablica roslin: " << endl << endl;
    vector <Roslina> roslinka;
    roslinka.push_back(<Roslina>(1,2,3,4, specjalnosc));

    return 0;
}

W razie potrzeby przesyłam całość kodu, ponieważ może coś innego powoduje ten błąd w kodzie int main:
 

#include <string>
#include <iostream>
#include <vector>

using namespace std;

class Roslina
{
public:

    string nazwa;
    int hp;

    void print()
    {
        cout << "Podaj nazwe rosliny: ";
        cin >> nazwa;
        cout << "Podaj punkty zycia: ";
        cin >> hp;
    }
};

class Najlepsze_rosliny :public Roslina
    {
    public:
        int atak;
        int obrona;
        string specjalnosc;

    void wypisz()
    {
        cout << "Podaj atak: ";
        cin >> atak;
        cout << "Podaj obrone: ";
        cin >> obrona;
        cout << "Podaj specjalnosc: ";
        cin >> specjalnosc;
    }
};

int main()
{
    cout << "Tablica roslin: " << endl << endl;
    vector <Roslina> roslinka;
    roslinka.push_back(<Roslina>(1,2,3,4));

    return 0;
}

 

komentarz 21 czerwca 2018 przez Szfierzak Gaduła (3,750 p.)

Widzę kilka błędów.

Pierwszy jeżeli chcesz dodać obiekt Roslina do wektora to nie używaj nawiasów <> one są zarezerwowane do czegoś innego. Za to konstrukcja typu:

roslinka.push_back(Roslina(1,2,3,4));

Jest już raczej ok. Ale...chyba nie zrozumiałem do końca o co Ci chodziło ostatnio z tymi konstruktorami, w każdym razie tutaj na pewno ich brak. Kod powyżej działa tak jakbyś miała konstruktor i przekazywała do niego cztery argumenty, a takowego konstruktora klasa Roslina nie ma. Dlatego albo trzeba dopisać odpowiednie konstruktory w klasach, albo dodawać obiekt wywołując konstruktor domyślny np.

roslinka.push_back(Roslina());

Ja jednak pokusiłbym się o implementację konstruktorów w obu klasach, oraz o deklarowanie pól klasy, które opisują rośliny, jako private lub protected, w zależności od intencji dziedziczenia.

komentarz 21 czerwca 2018 przez mokrowski Mędrzec (155,460 p.)
#include <string>
#include <iostream>
#include <vector>
#include <cstdint> // XXX: dla size_t
 
using namespace std; // XXX: Używanie tak namespace jest kontrowersyjne... 
 
class Roslina
{
public:
    // XXX: print() to nietrafiona nazwa. Raczej wprowadzasz
    // dane więc wprowadz(), wczytaj() czy read().
void wczytaj()
{
    cout << "Podaj nazwe rosliny: ";
    cin >> nazwa;
    cout << "Podaj punkty zycia: ";
    // XXX: Brakuje obsługi nieprawidłowo wprowadzonych
    // danych. Spróbuj wprowadzić napis i sprawdź co 
    // się dzieje
    cin >> hp;
}
private: // XXX: Atrybuty (co do zasady) uczyń prywatnymi
    string nazwa;
    int hp; // XXX: BTW, hp może być ujemne? "Roślia zombie"?
};
 
class Najlepsze_rosliny : public Roslina
{
public:
    int atak;
    int obrona;
    string specjalnosc;

// XXX: Znów.. jakie wypisz() jeśli pytasz o dane?
void wczytaj()
{
    cout << "Podaj atak: ";
    cin >> atak;
    cout << "Podaj obrone: ";
    cin >> obrona;
    cout << "Podaj specjalnosc: ";
    cin >> specjalnosc;
}
};
 
int main()
{
    cout << "Wektor roslin: \n'n"; // XXX: Nie wystarczy 2 x '\n' ?
    vector<Roslina> roslinki;
    // Zakładam że chcesz mieć np. 3 rośliny...
    for(size_t i = 0; i < 3; ++i)
    {
        Roslina roslina;
        roslina.wczytaj(); // XXX: Niech już i tak będzie. Lepiej jednak robić to konstruktorem.
        roslinki.push_back(roslina);
    }
}

 

komentarz 21 czerwca 2018 przez fruczka Użytkownik (570 p.)
Bardzo dziękuję za pomoc. Teraz wszystko rozumiem ;)

Podobne pytania

0 głosów
0 odpowiedzi 170 wizyt
pytanie zadane 17 czerwca 2018 w C i C++ przez fruczka Użytkownik (570 p.)
0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 12 stycznia 2018 w Sprzęt komputerowy przez Sznurek11 Obywatel (1,000 p.)
0 głosów
3 odpowiedzi 809 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez PirchHD Obywatel (1,730 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...