Strona 1 z 2
[c++] definiowanie funkcji składowej
: 4 cze 2009, o 19:07
autor: pool
Witam.
Mam taką klasę:
Kod: Zaznacz cały
#include<iostream>
using namespace std;
class Osoba;
{
public:
//konstruktor przydziela pamięć na pola tekstowe
// i nadaje wszystkim polom odpowiednie wartości
Osoba(char* Imie, char* Nazwisko, char* Pesel);
//destruktor zwalnia przydzielona pamięć
~Osoba(void);
friend ostream& operator<< (ostream& wy, const Osoba& osoba);
private:
char* Imie;
char* Nazwisko;
char* Pesel;
};
Jak zdefiniować funkcje składowe zgodnie z prototypami i komentarzami zamieszczonymi w definicji klasy
[c++] definiowanie funkcji składowej
: 4 cze 2009, o 20:29
autor: Tomcat
Troche nielogiczne te ostatnie zdanie, ale niech już będzie. Wiem o co Ci chodzi, tak mi się przynajmniej zdaje. Deklaracje znajdują się w ciele klasy, czyli to to co napisałeś. Jeżeli chcemy zdefiniować funkcję składową w takiej postaci (typ) Klasa::funkcja(argumenty) czyli np void MyClass::Rysuj(int długosc, int szerokosc). W tym zadaniu trzeba jednak zdefiniować konstruktor, destruktor i jeden operator. Robi się to dokładnie tak samo. Rozumiesz? Czy wolałbyś jednak zobaczyć kod?
[c++] definiowanie funkcji składowej
: 5 cze 2009, o 16:28
autor: pool
chyba wiem o co chodzi, ale dopiero zaczynam się tego języka uczyć i byłbym wdzięczny za napisanie kodu.
[c++] definiowanie funkcji składowej
: 5 cze 2009, o 18:54
autor: Dedemonn
Jeśli myślisz, że wiesz o co chodzi, to spróbuj napisać ten kawałek kodu. Jeśli o dziwo nie będzie działał i nie będziesz wiedział dlaczego, to przeklej tu kod i wtedy poradzimy - to lepsza droga nauki. ;]
Pzdr.
[c++] definiowanie funkcji składowej
: 6 cze 2009, o 15:58
autor: pool
Kod: Zaznacz cały
#include<iostream>
using namespace std;
class Osoba
{
public:
//konstruktor przydziela pamięć na pola tekstowe
//i nadaje wszystkim polom odpowiednie wartości
Osoba(char* Imie, char* Nazwisko, char* Pesel);
//destruktor zwalnia przydzielona pamięć
~Osoba(void);
friend ostream& operator<< (ostream& wy, const Osoba& osoba);
private:
char* Imie;
char* Nazwisko;
char* Pesel;
};
void Osoba::Osoba(char* Imie, char* Nazwisko, char* Pesel)
{
??
}
void Osoba::~Osoba()
{
delete[] Imie;
delete[] Nazwisko;
delete[] Pesel;
}
Osoba & Osoba::operator<< (ostream& wy, const Osoba& osoba)
{
wy<<osoba.Imie<<" "<<osoba.Nazwisko<<" "<<osoba.Pesel;
return wy;
}
int main()
{
Osoba OSOBA1("TOMEK","NOWAK","0987654321");
cout<<OSOBA1<<endl;
return EXIT_SUCCESS;
}
nie moge sobie z tym poradzic...:/
[c++] definiowanie funkcji składowej
: 6 cze 2009, o 18:27
autor: Szemek
class Osoba // po co zaraz za tym był średnik
{
// ciało klasy
};
konstruktor i destruktor nie mają żadnego typu przed nazwą
Unikaj takich samych nazw parametrów konstruktora jak nazwy zmiennych, którym chcesz nadać jakieś wartości (przypisanie a=a, jest bez sensu i nic z tego dobrego nie będzie)
Lepiej napisać np.
Osoba::Osoba(char* I, char* N, char* P)
Dopisałem ciało konstruktora i wprowadziłem poprawkę przy przeciążaniu operatora <<
Zamiast:
Osoba & Osoba::operator<<
jest: ostream & operator<<
Kod programu:
Jeśli ktoś ma lepszy pomysł na ciało konstruktora, to chętnie zobaczę.
[c++] definiowanie funkcji składowej
: 6 cze 2009, o 18:28
autor: Tomcat
No i jest spoko, konstruktor musi przyporzadkować podane argumenty odpowiednim składowym obiektu, to taka mała podpowiedź
EDIT #UP: Szemek, dobra propozycja można też użyć strcpy() zamiast tych pętli for, ale wielkiego zysku wydajnościowego nie będzie, o ile w ogóle jakiś będzie
[c++] definiowanie funkcji składowej
: 6 cze 2009, o 20:43
autor: pool
o to mi chodziło:) dzięki Szemek.
niestety funkcji strcpy() nie umiem zastosować:/
Jeżeli chciałbym zdefiniować nową klasę wyprowadzoną z tej klasy, która będzie zawierała jakieś pole prywatne typu wskaźnik na znak, czy to jest poprawnie:
Kod: Zaznacz cały
class nowaklasa : public Osoba
{
public:
//
private:
int nrIndeksu;
int *wskaznik;
wskaznik = &nrIndeksu;
};
??
[c++] definiowanie funkcji składowej
: 6 cze 2009, o 21:01
autor: Tomcat
Wskaźnik na znak? To chyba powinno być char*
[c++] definiowanie funkcji składowej
: 7 cze 2009, o 13:42
autor: qw3r
moze wytlumaczyc mi ta linije:
z gory dziekuje .
[c++] definiowanie funkcji składowej
: 7 cze 2009, o 14:05
autor: Szemek
qw3r, alokujemy sobie miejsce no kopiowany ciąg znaków
strlen - funkcja ta zwraca długość ciągu znaków
+1 - ostatnia pozycja w tablicy znaków będzie zajmowana przez znacznik końca tekstu '\0'
[c++] definiowanie funkcji składowej
: 7 cze 2009, o 14:26
autor: Krev
Szemek pisze:
strlen - funkcja ta zwraca długość ciągu znaków
jakas roznica od string.length() ?
[c++] definiowanie funkcji składowej
: 7 cze 2009, o 14:45
autor: Szemek
Krev pisze:jakas roznica od string.length() ?
Zasadnicza:
- zwraca długość dla napisów w stylu C
(const char * str)
Kod: Zaznacz cały
http://www.cplusplus.com/reference/string/string/length/
- metoda klasy string, zwraca długość napisu typu string
[c++] definiowanie funkcji składowej
: 7 cze 2009, o 14:57
autor: Krev
Szemek pisze:Krev pisze:jakas roznica od string.length() ?
Zasadnicza:
- zwraca długość dla napisów w stylu C
(const char * str)
Kod: Zaznacz cały
http://www.cplusplus.com/reference/string/string/length/
- metoda klasy string, zwraca długość napisu typu string
Pardon. Tak jakos nie popatrzylem uwaznie. Nie znam C i jakos tak wyszlo
[c++] definiowanie funkcji składowej
: 11 cze 2009, o 13:52
autor: pool
chciałbym zdefiniować nową klasę wyprowadzoną z tej klasy, która będzie zawierała:
- oprócz pól odziedziczonych, pole prywatne (nrIndeksu) typu wskaźnik na znak,
- konstruktor wywołujący konstruktor klasy bazowej, a ponadto realizujący przydział pamięci na nrIndeksu i kopiowanie łańcucha,
- destruktor który zwalnia przydzieloną pamięć,
- operator wyprowadzania danych do strumienia wyjściowego.
Na koniec zdefiniować funkcje main, w której tworzony jest przykładowy obiekt klasy Osoba i klasy Student, a następnie wyprowadzić informacje przechowywane w obiektach do standardowego strumienia wyjściowego.
Niestety mam sporo błędów, największe problemy mam z tym konstruktorem..:/ prosiłbym o poprawki i wskazówki:)
Kod: Zaznacz cały
#include<iostream>
using namespace std;
class Osoba
{
public:
Osoba(char* Imie, char* Nazwisko, char* Pesel);
~Osoba();
friend ostream& operator<< (ostream& wy, const Osoba& osoba);
protected: // nie może być private, bo nie ma dostępu:/
char* Imie;
char* Nazwisko;
char* Pesel;
};
Osoba::Osoba(char* I, char* N, char* P)
{
Imie = new char[strlen(I)+1];
for (int i=0; i<strlen(I)+1; i++)
Imie[i] = I[i];
Nazwisko = new char[strlen(N)+1];
for (int i=0; i<strlen(N)+1; i++)
Nazwisko[i] = N[i];
Pesel = new char[strlen(P)+1];
for (int i=0; i<strlen(P)+1; i++)
Pesel[i] = P[i];
}
Osoba::~Osoba()
{
delete[] Imie;
delete[] Nazwisko;
delete[] Pesel;
}
ostream & operator<< (ostream& wy, const Osoba& osoba)
{
wy << osoba.Imie << " " << osoba.Nazwisko << " " << osoba.Pesel;
return wy;
}
class Student : public Osoba
{
private:
char* nrIndeksu;
public:
Student(char* Imie, char* Nazwisko, char* Pesel, char* nrIndeksu);
~Student()
{
delete[] nrIndeksu;
}
friend ostream& operator<< (ostream& wy, const Student& student);
};
Student::Student(char* I, char* N, char* P, char* nI): Osoba(I,N,P)
{
nrIndeksu = new char[strlen(nI)+1];
for (int i=0; i<strlen(nI)+1; i++)
nrIndeksu[i] = nI[i];
}
ostream & operator<< (ostream& wy, const Student& student)
{
wy << student.Imie << " " << student.Nazwisko << " " << student.Pesel << " " << student.nrIndeksu;
return wy;
}
int main()
{
Osoba OSOBA1("TOMEK","NOWAK","0987654321");
cout<<OSOBA1<<endl;
Student STUDENT1("TOMEK2","NOWAK2","7654321","78000");
cout<<STUDENT1<<endl;
system("pause");
return EXIT_SUCCESS;
}
Poprawiony:))