Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Klasy - dziedziczenie, funkcje trygonomteryczne

Ostatnio zmodyfikowano 2016-09-24 18:54
Autor Wiadomość
Eunectees
Temat założony przez niniejszego użytkownika
Klasy - dziedziczenie, funkcje trygonomteryczne
» 2016-09-23 14:27:36
Mam problem z programem. Napisałem program i wyskakują mi błędy, których sam nie umiem poprawić bo nie do końca rozumiem o co w nich chodzi. Jak by ktoś poprawił mi te błędy i wytłumaczył na czym one polegają to byłbym bardzo wdzięczny :)

C/C++
#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class CKat
{
private:
    double radian;
   
public:
    CKat( double wartosc );
    void Dodaj( double wartosc );
    void Odejmij( double wartosc );
    void Podziel( double wartosc );
    virtual double wartosc();
    bool CzyWieksze( CKat kat );
    bool CzyMniejsze( CKat kat );
    bool CzyRowne( CKat kat );
    virtual double Sin();
    virtual double Cos();
};



double CKat::Sin()
{
    return sin( radian );
}


double CKat::Cos()
{
    return cos( radian );
}


CKat::CKat( double wartosc )
{
    radian = 0;
    if( wartosc >= 0 && wartosc <= 6.28318 )
    { radian = wartosc; }
}


void CKat::Dodaj( double wartosc )
{
    radian = radian + wartosc;
}


void CKat::Odejmij( double wartosc )
{
    radian = radian - wartosc;
}


void CKat::Podziel( double wartosc )
{
    radian = radian / wartosc;
}


double CKat::wartosc()
{
    return radian;
}


bool CKat::CzyWieksze( CKat kat )
{
    if( radian > kat.radian ) { return true; } else return false;
   
}


bool CKat::CzyMniejsze( CKat kat )
{
    if( radian < kat.radian ) { return true; } else return false;
   
}



bool CKat::CzyRowne( CKat kat )
{
    if( radian == kat.radian ) { return true; } else return false;
   
}







class CKatStop
    : public CKat
{
protected:
    double stopien;
   
public:
    CKatStop( double wartosc );
   
    double wartosc();
    double Sin();
    double Cos();
};


CKatStop::CKatStop( double wartosc )
{
    stopien = 0;
    if( wartosc >= 0 && wartosc <= 360 )
    { stopien = wartosc; }
}


double CKatStop::Sin()
{
    double pom;
    pom = stopien *( 3.14159 / 180 );
    return sin( pom );
}

double CKatStop::wartosc()
{
    return stopien;
}


double CKatStop::Cos()
{
    double pom;
    pom = stopien *( 3.14159 / 180 );
    return cos( pom );
}


int main()
{
    cout << "Kat w radianach. " << endl;
   
    CKat prob( 5 );
    cout << prob.wartosc() << " wyswietl\n";
   
    prob.Dodaj( 2 );
    cout << prob.wartosc() << " dodaj\n";
   
    prob.Odejmij( 3 );
    cout << prob.wartosc() << " odejmij\n";
   
    prob.Podziel( 2 );
    cout << prob.wartosc() << " podziel\n";
   
   
    CKat prob1( 6 );
   
   
   
    cout << "Rowne: " << prob.CzyRowne( prob1 ) << endl;
    cout << "Wieksze: " << prob.CzyWieksze( prob1 ) << endl;
    cout << "Mniejsze: " << prob.CzyMniejsze( prob1 ) << endl;
    cout << "Sinus: " << prob.Sin() << endl;
    cout << "Cosinus: " << prob.Cos() << endl;
   
   
    cout << "Kat w stopniach. " << endl;
   
    CKatStop kat_s( 120 );
    cout << kat_s.wartosc() << " wyswietl\n";
   
    kat_s.Dodaj( 2 );
    cout << kat_s.wartosc() << " dodaj\n";
   
    kat_s.Odejmij( 3 );
    cout << kat_s.wartosc() << " odejmij\n";
   
    kat_s.Podziel( 2 );
    cout << kat_s.wartosc() << " podziel\n";
   
    CKatStop kat_s1( 220 );
    cout << "Rowne: " << kat_s.CzyRowne( kat_s1 ) << endl;
    cout << "Wieksze: " << kat_s.CzyWieksze( kat_s1 ) << endl;
    cout << "Mniejsze: " << kat_s.CzyMniejsze( kat_s1 ) << endl;
    cout << "Sinus: " << kat_s.Sin() << endl;
    cout << "Cosinus: " << kat_s.Cos() << endl;
   
    return 0;
   
}


Treść zadania:

Utworzyć klasę CKat, reprezentującą kąt i pozwalającą na operację na nich. Założyć, że kąt może być w przedziale <0,2π), czyli reprezentować wartość w radianach.
Należy zaimplementować metody:
    void Dodaj(double wartosc);     :zwiększający kąt o wartość typu double
    void Odejmij(double wartosc);   :j.w. (odejmowanie) 
    void Podziel(double wartosc);   :podzielenie kąta przez wartość typu double
    double wartosc();               :zwracanie wartości kąta w radianach
    bool CzyWieksze(CKat kat);      :porównanie dwóch kątów
    bool CzyMniejsze(CKat kat);     :j.w.
    bool CzyRowne(CKat kat);        :j.w.

Ponadto należy zdefiniować konstruktor domyślny oraz z parametrem typu double.
Napisać metody: Sin, Cos: zwracające wartości funkcji trygonometrycznych dla kąta reprezentowanego przez obiekty klasy CKat.
Utworzyć klasę CKatStop dziedziczącą po klasie CKat i reprezentującą kąt w stopniach <0,360).
P-151937
Luq
» 2016-09-23 15:35:01
Nie zdefiniowałeś domyślnego konstruktora dla klasy bazowej
P-151938
Eunectees
Temat założony przez niniejszego użytkownika
» 2016-09-23 19:05:52
Zadam może głupie pytanie teraz, ale jak to zrobić? Bo z tym właśnie mam problem

Myślałem, że domyślny konstruktor jest dodawany automatycznie, po dodaniu go wyskakują mi takie błędy:
C/C++
/ tmp / ccyqXNU2.o: In function ` CKatStop::CKatStop( double ) ':
    :(.text + 0x13f )
    : undefined reference to ` CKat::CKat() ' / tmp / ccyqXNU2.o
    : In function ` main ':
    :(.text.startup + 0x16e )
    : undefined reference to ` CKat::CKat() '
    :(.text.startup + 0x239 )
    : undefined reference to ` CKat::CKat() ' collect2
    : error
    : ld returned 1 exit status
P-151943
michal11
» 2016-09-23 19:15:26
Musisz wywołać konstruktor klasy bazowej w konstruktorze klasy dziedziczącej jeżeli klasa bazowa nie ma domyślnego konstruktora. Czyli w twoim przypadku będzie to:
C/C++
CKatStop::CKatStop( double wartosc )
    : CKat( wartosc )
{
    //...
}
P-151944
Eunectees
Temat założony przez niniejszego użytkownika
» 2016-09-24 18:54:54
Dzięki, wszystko działa :)
P-151968
« 1 »
  Strona 1 z 1