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

C++ obiektowe, zastosowanie konstruktora - różnice w sposobach implementacji

0 głosów
404 wizyt
pytanie zadane 23 października 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Mam takie pytanie do bardziej doświadczonych. smiley Mam kod programu C++, który zbudowany jest z jednej klasy Auta. Kod programu wygląda tak:

#include <iostream>
using namespace std;

//od tego miejsca prototyp klasy

class Auta
{
private:
    std::string marka_;
    std::string model_;
    int rok_produkcji_;
    float pojemnosc_silnika_;
    int ilosc_koni_mechanicznych_;
    int cena_netto_;
    int cena_brutto_;
    void obliczenie_ceny_brutto()
    {
        cena_brutto_ = cena_netto_ * 1.22;
    }
public:
    Auta(); //prototyp konstruktora domyślnego
    Auta(std::string marka, std::string model, int rok, float poj, int konie, int netto);
    ~Auta();
    void get_car();
    void show();
};

//od tego miejsca funkcja glowna main

int main()
{
    {
        Auta auto1;
        auto1.get_car();
        auto1.show();
    }
    {
        Auta car1("fiat", "126p", 1985, 0.65, 24, 200);
        car1.show();
    }
    return 0;
}

//od tego miejsca definicje funkcji, konstruktorów, destruktora

Auta::Auta()
{
    marka_ = "bez nazwy";
    model_ = "bez nazwy";
    rok_produkcji_ = 0;
    pojemnosc_silnika_ = 0.0;
    ilosc_koni_mechanicznych_ = 0;
    cena_netto_ = 0;
}

Auta::Auta(std::string marka, std::string model, int rok, float poj, int konie, int netto)
{
    marka_ = marka;
    model_ = model;
    rok_produkcji_ = rok;
    pojemnosc_silnika_ = poj;
    ilosc_koni_mechanicznych_ = konie;
    cena_netto_ = netto;
    obliczenie_ceny_brutto();
}

Auta::~Auta()
{
}
void Auta::get_car()
{
    cout << "Podaj marke samochodu, jaki chcesz kupic: ";
    cin >> marka_;
    cout << "Podaj model samochodu: ";
    cin >> model_;
    cout << "Podaj rok produkcji: ";
    cin >> rok_produkcji_;
    cout << "Podaj pojemnosc silnika: ";
    cin >> pojemnosc_silnika_;
    cout << "Podaj ilosc koni mechanicznych: ";
    cin >> ilosc_koni_mechanicznych_;
    cout << "Podaj cene tego auta: ";
    cin >> cena_netto_;

}

void Auta::show()
{
    cout << endl;
    cout << "Marka auta: " << marka_ << endl;
    cout << "Model auta: " << model_ << endl;
    cout << "Rok produkcji: " << rok_produkcji_ << endl;
    cout << "Pojemnosc silnika: " << pojemnosc_silnika_ << endl;
    cout << "Ilosc koni mechanicznych: " << ilosc_koni_mechanicznych_ << endl;
    cout << "Cena netto: " << cena_netto_ << "zl" << endl;
    obliczenie_ceny_brutto();
    cout << "Cena brutto: " << cena_brutto_ << "zl" << endl;
    cout << endl;
}

I teraz moje pytanie z tym związane. Jaka jest różnica między tworzeniem obiektów i operowaniem nimi jednym sposobem za pomocą:

        Auta auto1;
        auto1.get_car();
        auto1.show();

A drugim sposobem za pomocą konstruktora:

        Auta car1("fiat", "126p", 1985, 0.65, 24, 200);
        car1.show();

Jedną zasadniczą różnicę widzę sam. Jest nią to, że w przypadku pierwszym to użytkownik podaje odpowiednie wartości do zmiennych takie jak model auta, jego rok produkcji itd. A w drugim przypadku to my sami pisząc program od razu narzucamy wszystkie parametry za pomocą konstruktora. Potem możemy użyć destruktora tak jak się to dzieje w programie (bo po wyjściu z bloku destruktor automatycznie działa), aby wyczyścić ten obiekt z pamięci. Czyli mamy kolejną różnicę. Czyścimy pamięć w ten sposób i pozbywamy się tego obiektu. Może to być przydatne w jakiś grach. Ale czy można usunąć taki obiekt korzystając z pierwszego sposobu, gdzie to użytkownik podaje dane samochodu? Jest może jakaś funkcja delete, która nam to obsłuży? I jakie są inne różnice w tych dwóch sposobach operowaniem nad obiektami?

2 odpowiedzi

+1 głos
odpowiedź 23 października 2016 przez Ehlert Ekspert (215,070 p.)
wybrane 23 października 2016 przez Evelek
 
Najlepsza

Twoja implementacja jest rzadka. Niezbyt często się zdarza, żeby obiekt miał metodę która czyta z klawiatury i nadaje wartości polom. Do tego jest konstruktor. Przypadek w którym instancja klasy jest tworzona przez samą siebie to chyba tylko singleton. 

Co do usuwania poczytaj o destruktorze. Ogarnij kiedy go wywołać, żeby nie wykrzaczył się program.

Lista inicjalizacyjna

Co do tworzenia obiektu to jest wiele metod ale bardzo często spotkasz się z:

  1. Fabryka abstrakcyjna
  2. Budowniczy
  3. Singleton
komentarz 23 października 2016 przez Evelek Nałogowiec (28,960 p.)

Niezbyt często się tak zdarza... widocznie klasy i obiekty mają inne lepsze zastosowanie o którym jeszcze mi nie przyszło się dowiedzieć. smiley Na chwilę obecną w celach edukacyjnych piszę sobie takie to proste programy, a jeszcze duuużo przede mną jak widać.

Dziękuję za te metody tworzenia obiektu. Zapoznam się oczywiście z nimi i je przeanalizuje, ale już teraz widzę, że nieco przekraczają mój poziom wiedzy.

+1 głos
odpowiedź 23 października 2016 przez Myśliwy Gaduła (3,080 p.)
Jest coś takiego jak operator new oraz delete, służą one do dynamicznego tworzenia i usuwania obiektów np. int* x= new int; w ten sposób otrzymujesz wskaźnik x do obiektu int, delete używa się troche prościej -> delete x; delete od razu wywołuje destruktor obiektu int, którego wskaźnikiem jest x.

Dynamiczne alokowanie pamięci
komentarz 23 października 2016 przez Evelek Nałogowiec (28,960 p.)

Popracuję nad tym, bo jeszcze nie próbowałem wrzucać do obiektów klas, ich metod itd. operatorów new i delete. smiley Dziękuje za wypowiedź.

Podobne pytania

0 głosów
2 odpowiedzi 350 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez nemezisso Użytkownik (860 p.)
0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 5 lipca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)
0 głosów
1 odpowiedź 365 wizyt

93,633 zapytań

142,558 odpowiedzi

323,058 komentarzy

63,141 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...