ne treba skontao sam
Imam par primjedbi na tvoje rješenje. Radi ono i ovako, ali može bolje ovo da se napiše.
1. Kad si unutar klase Pravougaonik, dovoljno je da napišeš void Uzmi, nema potrebe za razrješenjem dosega sa Pravougaonik::Uzmi.
2. Nije ti radilo vjerovatno zato što si stavio const za računanje površine. Ali, vidi ovo - svaka metoda koja je članica klase, a nije deklarisana kao friend, ima jedan skriveni argument. Ta argment je prvi argument metode (ako ih ima više), odnosno jedini (ako stoje samo () zagrade). this je pokazivač na tekući objekat. Tako pošto si stavio argumente x i y, probaj da u nekoj metodi napišeš this-> - ispisaće ponuđene opcije, a to su svi elementi klase koji su do sad definisani, znači imaćeš u meniju da odabereš x, y ili bilo koju metodu do tog trenutka definisanu. Pošto ti ovom metodom koristiš samo elemente klase, nemaš potrebu za nekim dodatnim argumentima, onda ti je bolje napisati ovako:
Kod:
class Pravougaonik
{
double a,b;
public :
explicit Pravougaonik (int a = 1, int b = 1); // ovo je specijalni tip metode - konstruktor (može biti više različitih, a destruktor samo jedan, explicit ne moraš stavljati još, ali čim počneš sa konstruktorima, nauči kad se i kako koristi)
double Povrsina () const; // računa površinu, pozivaš tamo gdje bi inače stavio P
void Pisi() const; // ovdje imaš jedan argument - this, tj. pokazivač na tekući objekat
};
Kod:
#include "pravougaonik.h"
#include <iostream>
#include <cstdlib>
using namespace std;
Pravougaonik::Pravougaonik (int a, int b)
{
if ((a <= 0) || (b <= 0)) exit (1);
x = a; y = b;
}
double Pravougaonik::Povrsina () const
{
return x * y;
}
void Pravougaonik::Pisi() const
{
cout << "x = " << x << " , y = " << y << " , P = " << Povrsina (); // isto kao da si napisao this->x, this->y, this->Povrsina () jer metoda Pisi nije friend, već prava metoda članica klase, pa ima pokazivač this koji pokazuje na tekući objekat te klase. Zato nemaš potrebe prosleđivati objekat tipa klase (kao ti što si prosleđivao p, kad već imaš pokazivač na taj isti objekat. Ono što si ti radio jeste da iz nekog objekta obj1 pozoveš za neki drugi objekat metodu za površinu. Zašto? Nema potrebe. Mogao bi uraditi obj1.Povrsina(obj2); Zar nije lakše pisati obj2.Povrsina();?
}
Kod:
#include "pravougaonik.h"
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
double a, b;
cin >> q;
cin >> w;
Pravougaonik p = new Pravougaonik (q, w);
p.Pisi ();
system("PAUSE");
cout << endl;
return 0;
}
Stavio sam:
a) umjesto int - double, da mogu i realni brojevi
b) izbacio višak Pravougaonik:: unutar same klase (i dalje mora onaj dio u posebnom .cpp fajlu)
c) umjesto Uzmi metode stavio sam konstruktor, mada je tvoja sreća što u ovom slučaju postoji podrazumjevani konstruktor kad ti ne napišeš svoj, ali si morao ručno unositi vrijednosti. Pogledaj malo po netu, ovo je jako bitno za oop!
d) umjesto <stdlib.h> sam stavio <cstdlib>
e) izbacio sam ti nepotrebne argumente u metodama. Dodao const tamo gdje samo čitaš argumente i računaš, a ne mijenjaš argumente.
f) računanje površine sam ti integrisao u metodu za ispis. Možeš je i ovako koristiti, kao imeobjekta.Povrsina ()