[c++] konstruktor

zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] konstruktor

Post autor: zxc18 »

Witam,

Mam taki problem: chce stworzyc klase definiujaca okrag.
Mam uzyc konstruktora do przypisania wartości początkowych na standardowe
współrzędne środka S(0,0) oraz promień r=1. No i obliczyc pole kola itd.

Gdy wywoluje konstruktor okrag A(x,y,r); to chce wpisac do x,y,r jakies wartosci ja to robie tak :

Kod: Zaznacz cały

class okrag
{
private :
	float x, y ,r;
public:
    okrag(float &x, float &y, float &r); 
	float fnPole(float r); };
...

Kod: Zaznacz cały

okrag::okrag(float &x, float &y, float &r)
{
	x=0; y=0; r=1;
}

void okrag::fnWczytaj(float &x, float &y, float &r)
{   


	cout<<"x = "; cin>>x;
	cout<<"y = "; cin>>y;
	cout<<"r = "; cin>>r;
}


float okrag::fnPole(float r)
{
	float pole = PI*pow(r,2);
	cout<<setprecision(3)<<"Pole = "<<pole<<endl;
	return pole;
}

int main(int argc, char* argv[])
{   
	float a,b,r;
    okrag A(a,b,r);
	A.fnWypisz(a,b,r);
	A.fnWczytaj(a,b,r);
	A.fnPole(r);
I tu moje pytanie, jak to zrobic bez uzycia referencji, wskaznikow, tak by to wszystko zalatwial konstruktor ? Jak zrobic by bylo jak najbardziej poprawne ? I jak najlepiej wpisywac dane do obiektu ? Bardzo prosze o wskazowki, dziekuje i pozdrawiam[/code]

EDIT : w sumie juz wiem: chyba najlepiej uzyc funkcji zaprzyjaznionej
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] konstruktor

Post autor: kadiii »

Nie dokońca jasno nakreśliłeś problem, ale spróbuję się domyślić. Jeśli chcesz przypisać dane do obiektu konstruktorem to możesz oczywiście zwyczajnie użyć innych zmiennych w nagłówkach a potem przypisać je w ciele konstruktora a wcześniej np.nadać im wartości domyślne. Możesz też użyć listy inicjalizacyjnej konstruktora. Rozumiem jednak, że chcesz jednak użyć czegoś innego do wpisywania danych do obiektu. Najwygodniej przeciążyć operator >> z klasy istream.
Wygląda to tak:

Kod: Zaznacz cały

istream &operator>>(istream &in, okrag &a)
{
  cout<<"Podaj x: "<<endl;
  in>>a.x;
  cout<<"Podaj y: "<<endl;
  in>>a.y;
  cout<<"Podaj r: "<<endl;
  n>>a.r; 
}
Łatwo zauważyć, że twoje x,y,r są prywatnymi składnikami klasy a funkcja operatorowa nie jest funkcją składową klasy. Trzeba więc, ustawić tę funkcję jako zaprzyjaźnioną z klasą okrag poprzedzając ją słowem kluczowym friend i dodając odpowiedni nagłówek wewnątrz klasy. Od tej pory możemy w funkcji głównej pisać dla obiektów klasy okrag

Kod: Zaznacz cały

okrag okrag1;
cin>>okrag1;
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c++] konstruktor

Post autor: soku11 »

A jesli chodzi o konstruktor to mozna napisac dwa (bezargumentowy oraz standardowy), tj:

Kod: Zaznacz cały

okrag::okrag(): x(0),y(0),r(1) {}

okrag::okrag(float xx,float yy,float zz): x(xx),y(yy),z(zz) {}
I oczywiscie dodac deklaracje do klasy Teraz jak napiszesz:

Kod: Zaznacz cały

okrag a;
okrag b(1,1,5);
To dostaniesz jeden okrag o wymiarach standardowych (a) oraz drugi o wymiarach (x=1,y=1,r=5). POZDRO
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

[c++] konstruktor

Post autor: zxc18 »

Hmm wydaje mi sie ze mam problem z kompilatorem -> Visual 6.0 , poniewaz gdy deklaruje w klasie punkt :
friend ostream &operator
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c++] konstruktor

Post autor: kadiii »

W Visualu 6.0 C++ jest bug na korzystanie z funkcji zaprzyjaźnionych. Masz o tym tutaj courses.cs.vt.edu/cs2606/Summer06/cs2704notes/C10.OperatorOverloading.pdf - strona 14
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

[c++] konstruktor

Post autor: Rafal88K »

zxc18 pisze:I jak zrobic by operator przeciazony
ODPOWIEDZ