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

Nie rozumiem błędu kompilatora - Klasy, dziedziczenie - C++

Object Storage Arubacloud
0 głosów
172 wizyt
pytanie zadane 25 marca 2017 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Kompilator wyrzuca mi błąd w linii 73 i narzeka: "no matching function for call to 'Combustion::Combustion()'". Nie rozumiem co robię źle. 

#include <iostream>
#include <conio.h>
#include <algorithm>
#include <windows.h>
#include <fstream>
#define PETROL_PER_LITER_PLN 5
#define IN_ROAD_COMBUSTION_LITERS_PER_100 4.8
#define CITY_COMBUSTION_LITERS_PER_100 7.3
#define MIXED_COMBUSTION_LITERS_PER_100 5.7

using namespace std;

class Combustion
{
protected:

    float kilometers;
    float cost;
    float liters;

public:

    Combustion(float kilometers_cin)
    {
        kilometers = kilometers_cin;
    }

    ~Combustion()
    {

    }

    float inRoadCombustion()
    {
        liters = (kilometers / 100) * IN_ROAD_COMBUSTION_LITERS_PER_100;
        cost = liters * PETROL_PER_LITER_PLN;

        return cost;
    }

    float cityCombustion()
    {
        liters = (kilometers / 100) * CITY_COMBUSTION_LITERS_PER_100;
        cost = liters * PETROL_PER_LITER_PLN;

        return cost;
    }

    float mixedCombustion()
    {
        liters = (kilometers / 100) * MIXED_COMBUSTION_LITERS_PER_100;
        cost = liters * PETROL_PER_LITER_PLN;

        return cost;
    }

};

class SaveToFile : public Combustion
{
private:
    fstream file;

public:
    float temporary_kilometers;
    float temporary_cost;
    float temporary_liters;
    char temporary_choice;

    SaveToFile(char choice)
    {
        temporary_kilometers = Combustion::kilometers;
        temporary_cost = Combustion::cost;
        temporary_liters = Combustion::liters;
        temporary_choice = choice;
    }

    ~SaveToFile()
    {

    }

    void save()
    {
        file.open("Lista sprawdzen.txt", ios::out | ios::app);

        if (file.good() == true)
        {
            if (temporary_choice == '1')
            {
                file<<endl<<"TRASA: ";
            }
            else if (temporary_choice == '2')
            {
                file<<endl<<"MIASTO: ";
            }
            else if (temporary_choice == '3')
            {
                file<<endl<<"MIESZANA: ";
            }
            file<<"Dystans: "<<temporary_kilometers<<"km | ";
            file<<"Ilość beznzyny: "<<temporary_liters<<"l | ";
            file<<"Koszt benzyny: "<<temporary_cost<<"zł"<<endl;
        }

        cout<<endl<<"Pomyslnie zapisano dane do pliku."<<endl<<endl;
        file.close();
    }
};

int main()
{
    bool yesNo=true;

    while (yesNo==true)
    {

        cout<<"KALKULATOR SPALANIA Fiat Punto II 1.2 60KM"<<endl<<endl;

        cout<<"Dlugosc trasy (KM):";

        float kilometers_cin;

        cin>>kilometers_cin;

        Combustion combustion(kilometers_cin);

        cout<<endl<<endl<<"Gdzie odbedzie sie podroz?"<<endl;
        cout<<"1. W trasie"<<endl;
        cout<<"2. W miescie"<<endl;
        cout<<"3. Jazda mieszana (trasa + miasto)"<<endl<<endl<<endl;

        char choice;

        do
        {
            choice = getch();

            switch (choice)
            {
            case '1':
            {
                cout<<"Podroz wyniesie okolo: "<<combustion.inRoadCombustion()<<" zl";
                SaveToFile save_main(choice);
                save_main.save();
                break;
            }
            case '2':
            {
                cout<<"Podroz wyniesie okolo: "<<combustion.cityCombustion()<<" zl";
                SaveToFile save_main(choice);
                save_main.save();
                break;
            }
            case '3':
            {
                cout<<"Podroz wyniesie okolo: "<<combustion.mixedCombustion()<<" zl";
                SaveToFile save_main(choice);
                save_main.save();
                break;
            }
            default:
            {
                cout<<"Nie ma takiej opcji - wybierz ponownie!"<<endl<<endl;
                break;
            }
            }
        }
        while (choice!='1' && choice!='2' && choice!='3');

        cout<<endl<<endl<<"Czy chcesz obliczyc ponownie? (t/n)";

        string confirmation;

        confirmation = getch();

        transform(confirmation.begin(), confirmation.end(), confirmation.begin(), ::tolower);

        if (confirmation=="t")
        {
            yesNo=true;
            system("cls");
        }
        else
        {
            return 0;
        }
    }

    getch();
    getch();

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 25 marca 2017 przez adrian17 Ekspert (344,860 p.)
wybrane 25 marca 2017 przez Konrad Nabożny
 
Najlepsza
    SaveToFile(char choice)
    {
        temporary_kilometers = Combustion::kilometers;

Klasa dziedziczy po Combustion, konstruktor musi wywołać konstruktor klasy bazowej. Nie powiedziałeś jaki konstruktor wywołać, więc kompilator próbuje wywołać konstruktor domyślny - którego nie ma.

Zacytuję błąd Clanga:

main.cpp:70:5: error: constructor for 'SaveToFile' must explicitly initialize the base class 'Combustion' which does not have a default constructor

(btw, #define? Naprawdę?)

komentarz 25 marca 2017 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Gdybym dowiedział się że konstruktor klasy która dziedziczy, wywołuje konstruktor klasy bazowej to tego pytania pewnie by nie było, oraz ominąłbym kilka godzin wczorajszego myślenia. Dziękuję za pomoc.

 

Co jest nie tak z #define? Lepiej byłoby gdybym użył jakiejś stałej globalnej?
komentarz 25 marca 2017 przez adrian17 Ekspert (344,860 p.)
Stała zawsze jest lepsza i bezpieczniejsza od #define, tak ogólnie :)
komentarz 25 marca 2017 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Dziękuję. Za chwilę zmienię #define na stałe, ale wcześniej zwracam się z jeszcze jednym pytanie.

http://wklej.org/id/3070499/

 

Dlaczego wartości zapisywane przez program w pliku tekstowym zawierają śmieci? Przecież nigdzie nie wywołuję destruktora. Nie rozumiem więc dlaczego z danymi dzieją tak takie dziwne rzeczy. Wszystko to mogę zrobić w mainie i nie mieć żadnych problemów, ale chcę trzymać się prawidłowego zapisu i stylu i oprzeć wszystko na klasach w ramach ćwiczenia samego siebie, ale niestety poległem.
komentarz 25 marca 2017 przez adrian17 Ekspert (344,860 p.)
Nie wypowiem się, bo nie widzę śmieci. (jedyne co bym spróbował to pozbyć się polskich znaków)
komentarz 26 marca 2017 przez Konrad Nabożny Stary wyjadacz (13,460 p.)

Mam na myśli to że program wpisuje do pliku coś takiego: 

TRASA: Dystans: 1.4013e-045km | Ilość beznzyny: 9.82594e-039l | Koszt benzyny: 9.82574e-039zł

TRASA: Dystans: 1.4013e-045km | Ilość beznzyny: 9.82594e-039l | Koszt benzyny: 9.82574e-039zł

MIESZANA: Dystans: 1.4013e-045km | Ilość beznzyny: 9.82594e-039l | Koszt benzyny: 9.82574e-039zł

 

Doskonale wiem że coś się dzieje ze zmiennymi w klasach, ale nie mogę znaleźć błędu. 

komentarz 26 marca 2017 przez adrian17 Ekspert (344,860 p.)
To jeszcze powiedz, jakie dajesz wejście że dostajesz taki wynik.
komentarz 26 marca 2017 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
http://wklej.org/id/3070499/

Linia 101,102,103.

 

Prawdopodobnie robię jakiś błąd w tych wszystkich zmiennych w klasach.
komentarz 26 marca 2017 przez adrian17 Ekspert (344,860 p.)
"wejście" znaczy "co wpisujesz".
komentarz 26 marca 2017 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Wpisuję najpierw ilość kilometrów,m czyli zwykłą liczbę w normalnym, realnym zakresie, a następnie 1, 2, lub 3 aby wybrać czy jazda była w trasie, w mieście, bądź była to jazda mieszana
+1 głos
odpowiedź 25 marca 2017 przez Dexterim Dyskutant (8,370 p.)

Problem jest dość prosty tworząc klase która dziedzieczy musisz wywolać konstruktor klasy po której dziedziczysz np.

 SaveToFile(char choice):Combustion(1)

 

Podobne pytania

0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez Sensej Użytkownik (540 p.)
0 głosów
2 odpowiedzi 153 wizyt
pytanie zadane 9 kwietnia 2016 w C i C++ przez Klik Obywatel (1,540 p.)
0 głosów
1 odpowiedź 144 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)

92,552 zapytań

141,399 odpowiedzi

319,533 komentarzy

61,938 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!

...