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

question-closed Obliczenia za pomocą getterów w klasie

0 głosów
112 wizyt
pytanie zadane 4 października 2015 w C i C++ przez radek024 Szeryf (75,200 p.)
zamknięte 4 października 2015 przez radek024

TL;DR: Jak dodać właściwości klasy za pomocą gettera w funkcji w klasie?

 

Witam, mam następujący problem:

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

class Sruba
{
	double a;
	double h;
	double r;
	double ro;
	
	public:
	Sruba()
	{
		a=0;
		h=0;
		r=0;
		ro=0;
	}
	
	//konstruktor samokopiujacy;
	Sruba(const Sruba &wzor)
	{
		a=wzor.a;
		r=wzor.r;
		h=wzor.h;
		ro=wzor.ro;
	}
	
	Sruba(char znak)
	{
		cout<<"Podaj wartosc dlugosci boku[cm]: ";
		cin>>a;
		cout<<"Podaj wysokosc sruby[cm]: ";
		cin>>h;
		cout<<"Podaj promien gwu[cm]: ";
		cin>>r;
		cout<<"Podaj gestosc [g/cm^3]: ";
		cin>>ro;
	}
	
	Sruba(double a1, double h1, double r1, double ro1)
	{
		a=a1;
		h=h1;
		r=r1;
		ro=ro1;	
	}
	
	//gettery
	double getA()
	{
		return a;
	}
	
	double getH()
	{
		return h;
	}

	double getR()
	{
		return r;
	}
	
	double getRo()
	{
		return ro;
	}
	
	//settery
	void setA(double NewA)
	{
		a=NewA;
	}

	void SetR(double NewR)
	{
		r=NewR;
	}
	
	void setH(double NewH)
	{
		h=NewH;
	}
	
	void setRo(double NewRo)
	{
		ro=NewRo;
	}	
	
	//oblicz wage
	double waga()
	{
		return h.getH()*ro.getRo()*((3*pow(a.getA(),2.0)*sqrt(3)/2)-(3.14*pow(r.getR(),2.0)));
	}
	
	//info
	void info()
	{
		cout<<"Wymiary srubki: "<<a<<"cm na "<<h<<"cm"<<endl;
		cout<<"Promien gwintu: "<<r<<"cm"<<endl;
		cout<<"Gestosc materialu: "<<ro<<" g/cm. "<<endl;
		cout<<"Waga srubki: "<<waga()<<endl;
	}
};
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	
	Sruba a=Sruba(5,20,3,5);
	Sruba(';');
	cout<<a.waga()<<endl;
	a.info();
	return 0;
}

Jak widać w kodzie, na chwilę obecną próbuję wykonać działanie na wartościach z klasy Srubka w funkcji waga(), ale nie mogę tego zrobić - pierwsza myśl -> nie mogą być zwykłe nazwy zmiennych, ponieważ są prywatne, więc kiszka, muszę użyć getterów. Gdy już tak zrobiłem, okazuje się że wyskakuje następujący błąd:

In member function 'double Sruba::waga()':
97    12        [Error] request for member 'getH' in '((Sruba*)this)->Sruba::h', which is of non-class type 'double'
97    22        [Error] request for member 'getRo' in '((Sruba*)this)->Sruba::ro', which is of non-class type 'double'
97    40        [Error] request for member 'getA' in '((Sruba*)this)->Sruba::a', which is of non-class type 'double'
97    75        [Error] request for member 'getR' in '((Sruba*)this)->Sruba::r', which is of non-class type 'double'

Z tego co rozumiem, błąd występuje ponieważ gettery są double, a klasa nie(???). Na zajęciach takie rozwiązanie w funkcji waga() działało bez problemu(lub tak naprawdę to wszystko jest ok, tylko ja gdzieś namachałem za dużo nawiasów i nie mogę ich znaleźć). Chcę, aby funkcja waga() wykonywała obliczenia na liczbach wprowadzonych za pomocą akcesora Sruba(char znak).

Mam nadzieję, że problem wytłumaczyłem dobrze.

Pozdrawiam, radek024.

 

komentarz zamknięcia: http://cpp0x.pl/forum/temat/?id=20898

2 odpowiedzi

0 głosów
odpowiedź 4 października 2015 przez Bondrusiek Maniak (60,670 p.)

Witam Serdecznie,

Zamień:

//oblicz wage
    double waga()
    {
        return h.getH()*ro.getRo()*((3*pow(a.getA(),2.0)*sqrt(3)/2)-(3.14*pow(r.getR(),2.0)));
    }

na

 double waga()
    {
        return h*ro*((3*pow(a,2.0)*sqrt(3)/2)-(3.14*pow(r,2.0)));
    }

Trzeba zapamiętać, że na składnikach prywatnych mogą operować funkcje składowe tej samej klasy. W tym przypadku funkcja waga oraz zmienne h,ro,a,r należą do tej samej klasy. Zauważ że zmienne a,ro,a,r są zmiennymi a nie klasą więc nie mogą używać operatora '.' .Możesz jeszcze użyć takiego zapisu:

double waga()
    {
        return Sruba::getH()*Sruba::getRo()*((3*pow(Sruba::getA(),2.0)*sqrt(3)/2)-(3.14*pow(Sruba::getR(),2.0)));
    }

 

komentarz 4 października 2015 przez radek024 Szeryf (75,200 p.)
Dzięki za odezwanie się, ale tej drugiej opcji już próbowałem i nic nie zrobiła poza tym, że program się kompiluje. Czyli problem leży gdzieś indziej, ale gdzie? Mam wrażenie że gdzieś zapomniałem wpisać gettery.
komentarz 4 października 2015 przez Bondrusiek Maniak (60,670 p.)
Sprecyzuj bo nie za bardzo rozumiem o co Ci chodzi.
komentarz 4 października 2015 przez radek024 Szeryf (75,200 p.)
rozwiązanie znalazłem na stronie: http://cpp0x.pl/forum/temat/?id=20898 , dzięki za uwagę ;)
–1 głos
odpowiedź 4 października 2015 przez Ehlert Ekspert (205,710 p.)
Możesz używać nazw zmiennych. Metoda waga zawiera się w klasie wiec spokojnie. Prywatnych zasobów klasy nie możesz bezpośrednio używać poza nią.
komentarz 4 października 2015 przez radek024 Szeryf (75,200 p.)
Ok, ale jeżeli podaję dane, to one nie są uwzględniane - to oczywiste, ponieważ są prywatne. Jak zrobić, aby wartości podawane za pomocą Sruba(char znak) był brane pod uwagę w waga()?
komentarz 4 października 2015 przez radek024 Szeryf (75,200 p.)

Tutaj jest efekt dzialania programu po usunięciu getterów z funkcji waga oraz wartości początkowych Sruba a ustawionych za pomocą Sruba(double a1, double h1, double r1, double ro1).

komentarz 4 października 2015 przez Ehlert Ekspert (205,710 p.)
Rozbij linijkę z wagi na drobniejsze obliczenia. Bardzo nie optymalne i nie czytelne w chwili obecnej.
komentarz 4 października 2015 przez radek024 Szeryf (75,200 p.)
rozwiązanie znalazłem na stronie: http://cpp0x.pl/forum/temat/?id=20898 , dzięki za uwagę ;)

Podobne pytania

0 głosów
0 odpowiedzi 64 wizyt
0 głosów
1 odpowiedź 524 wizyt
pytanie zadane 12 lipca 2019 w Java przez manager96 Bywalec (2,010 p.)
+2 głosów
1 odpowiedź 181 wizyt
pytanie zadane 20 czerwca 2016 w C i C++ przez JAKUBW Nałogowiec (33,500 p.)

86,526 zapytań

135,279 odpowiedzi

300,595 komentarzy

57,275 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...