• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
320 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 (214,530 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 247 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez nemezisso Użytkownik (860 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 5 lipca 2017 w C i C++ przez excavelty Bywalec (2,480 p.)
0 głosów
1 odpowiedź 256 wizyt

93,187 zapytań

142,203 odpowiedzi

322,017 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2365p. - dia-Chann
  2. 2326p. - Łukasz Piwowar
  3. 2315p. - Łukasz Eckert
  4. 2301p. - CC PL
  5. 2269p. - Tomasz Bielak
  6. 2235p. - Łukasz Siedlecki
  7. 2232p. - rucin93
  8. 2169p. - Marcin Putra
  9. 2164p. - Adrian Wieprzkowicz
  10. 2006p. - Michal Drewniak
  11. 1901p. - Mikbac
  12. 1842p. - Anonim 3619784
  13. 1806p. - Dawid128
  14. 1744p. - rafalszastok
  15. 1487p. - Michał Telesz
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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...