Programowanie obiektowe

0

Napisz klasę Funkcja, w której zdefiniujesz:

prywatne pole x;
publiczną czysto wirtualną metodę value zwracającą wartość funkcji w punkcie x;
Napisz klasy pochodne określające funkcje: liniową, kwadratową, sinusoidalną. W razie potrzeby dodaj do klas odpowiednie metody. Napisz funkcję main, w której przetestujesz napisane klasy.

Czy dobry jest początek ? I czy poprawnie jest udostępnione prywatne pole x ?


using namespace std;

class Funkcja{
	
	private:
	float x;
	public:
	virtual void pole()=0;
	Funkcja(float x)
{
	this->x=x=1;
}
	void set_x(float x)
	{
		this->x = x;
	}
	int get_x()
	{
		return x;
	}
};


class Liniowa : public Funkcja{

	
	public:
		
		void pole()
		{
			this->set_x(2.0);
		}					
	
	
};

class Kwadratowa : public Funkcja
{

	

	
};

class Sinusoida : public Funkcja{
	public: 
	virtual void pole(){
		cout<<"Sinusoida "<<1<<endl;
	}
};```
0

Wrzuć kod jako sformatowany bo nic nie widać.

0

Nie udostępniasz nigdzie prywatnego pola (zresztą zadanie jest bez sensu, po co to pole jest w ogóle?)

Zadanie wymaga abyś zdefiniował funkcję obliczającą wartość w punkcie X. Na razie takiej funkcji nie masz. Jest funkcja pole(), ale ona 1) jest bezsensownie nazwana, 2) nic nie zwraca.

0

To od czego w takim razie powinienem zrobić

0

Zdefiniuj funkcję zwracającą wartość. Pewnie powinna nazywać się value() albo wartosc() albo jakoś tak, aby wskazywała na to co robi. Typem zwracanym (i przyjmowanym) zapewne powinno być double

0
#include <iostream>

using namespace std;

class Funckja
{
	private:
	int x;	
	public:
		virtual double value()
		{
			return x;
		};
};

0

Funkcja miała być czysto wirtualna. Ech, teraz rozumiem, zamiast implementować to w sensowny sposób, musisz przekazać w konstruktorze wartość do x, a potem pobrać to za pomocą protected gettera wartość x w nadpisaniu funkcji wirtualnej. Słabe to zadanie.

0
#include <iostream>

using namespace std;

class Funckja
{
	private:
	int x;	
	public:
		virtual void value()=0;
		
};

  • mam funkcję czysto wirtualna. Jak dostać się teraz do private x ?
0

Zrób metodę z zakresem widoczności protected (albo public) zwracającą wartość x.

0
#include <iostream>

using namespace std;

class Funckja
{
	private:
	int x;	
	public:
	
virtual void value()=0;
	void set_x(int nx)
	{
	x = nx;		
	}
	
	int get_x(){ return x;	}
			
};

*ok , co dalej
0

Teraz implemntuj klasy pochodne.

getter powinien być const. W sumie funkcja value chyba też. Dlaczego zaczęła nagle zwracać void?

0

ok już zmieniam to. Jak teraz zrobić virtual int w klasie liniowej

#include <iostream>

using namespace std;

class Funckja
{
	private:
	int x;	
	public:
		
	virtual int value()=0;
	void set_x(int nx)
	{
	x = nx;		
	}
	
	int get_x(){ return x;	}
			
};

class Liniowa : public Funckja
{
	public:
		
		virtual int value(){
			
		}
};
0

Dlaczego teraz jest int? Jaką wartość ma sin(π/6)?

0

zmienione na float już jest

#include <iostream>

using namespace std;

class Funckja
{
	private:
	float x;	
	public:
		
	virtual float value()=0;
	void set_x(float nx)
	{
	x = nx;		
	}
	
	float get_x(){ return x;	}
			
};

class Liniowa : public Funckja
{
	public:
		
		virtual float value(){
			
		}
};
0

Widzę, że bardzo bronisz się przed sugestiami :​D
No dobra, to teraz implementuj funkcje.

0

w jaki sposob ją implementować ?

0

Funkcja liniowa powinna być liniowa, sinosuidalna powinna być sinosuidalna, a kwadratowa powinna być kwadratowa. Możesz im dodać dodatkowe parametry, np. pochylenie funkcji liniowej i wartości kolejnych współczynników wielomianu dla kwadratowej.

0

Czy to ma sens ?
class Liniowa : public Funckja
{
public:
float a,b;;

	virtual float value(){
		a=1;
		b=2;
		cout<<(a*this->get_x())+b;
	}

};

0

Poza sposobem przypisania a i b (które powinny być przypisane w konstruktorze, lub mieć własne settery) i brakiem zwrócenia wartości z funkcji - tak. Czyli jeszcze masz co poprawić.

0

Poprawione.

class Liniowa : public Funckja
{
	private:
	float a,b;
	public:
		Liniowa(float a,float b)
		{
			a=a=1,b=b=2;
		}
	
		virtual float value(){
		
			cout<<(this->a*this->get_x())+this->b;
			
		}
};
0

Nadal nic nie zwracasz z funkcji. Osobiście też bym użył double zamiast float, ale o tym pisałem już dobre kilka postów temu.

0

to mam zwyczajnie napisać return value ?

0

Masz zwrócić wartość funkcji liniowej dla danego x.

0

To nie wiem co mam napisać , możesz powiedzieć ?

0

Masz zwrócić wartość zamiast ją wypisywać.

0
class Liniowa : public Funkcja
{
	private:
	float a,b;
	public:
		Liniowa(float a,float b)
		{
			a=a=1,b=b=2;
		}
	
		 virtual float value(){
		
			return (this->a*this->get_x())+this->b;
			
		}
};
0

Dlaczego tak dziwnie przypisujesz do a i b?

Na oko wygląda dobrze, tylko value fajnie by było gdyby była const i używała override

0

Ok zmienione wszędzie na const.

Wywyołanie funkcji powinno być takie ?

int main()
{
	Funkcja *wsk;
	Liniowa l(1,2);
	wsk = &l;
	wsk->value();
	return 0;
	
}
0

Tak, ale teraz nigdzie nie wypisujesz ;​)

Aha, jeszcze jedno: jak masz funkcje wirtualne i ogółem dynamiczny polimorfizm to na pewno¹ musisz mieć wirtualny destruktor.

¹ pewnie da się pomyśleć o przypadkach gdzie tak nie jest, ale jako nowicjusz nie zawracaj sobie tym głowy, to jest reguła która się w​łaściwie zawsze sprawdza.

0
int main()
{
	Funkcja *wsk;
	Liniowa l(1,2);
	wsk = &l;
	cout<<wsk->value();
	return 0;
	
}

Wyskakuje mi błąd ld returned 1 exit status

1 użytkowników online, w tym zalogowanych: 0, gości: 1