• 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
103 wizyt
pytanie zadane 23 października 2016 w C i C++ przez użytkownika Evelek Stary wyjadacz (14,780 punkty)

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 użytkownika Ehlert Maniak (73,350 punkty)
wybrane 23 października 2016 przez użytkownika 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 użytkownika Evelek Stary wyjadacz (14,780 punkty)

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 użytkownika Myśliwy Gaduła (3,080 punkty)
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 użytkownika Evelek Stary wyjadacz (14,780 punkty)

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 77 wizyt
pytanie zadane 30 grudnia 2015 w C i C++ przez użytkownika nemezisso Użytkownik (860 punkty)
0 głosów
2 odpowiedzi 111 wizyt
pytanie zadane 6 maja 2016 w C i C++ przez użytkownika Przemek Bywalec (2,610 punkty)
0 głosów
1 odpowiedź 78 wizyt
pytanie zadane 13 sierpnia 2016 w C i C++ przez użytkownika SebekMakaron Obywatel (1,010 punkty)
...