[c++] definiowanie funkcji składowej

Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

[c++] definiowanie funkcji składowej

Post 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
Tomcat
Użytkownik
Użytkownik
Posty: 327
Rejestracja: 23 mar 2009, o 21:51
Płeć: Mężczyzna
Lokalizacja: Świdnica
Podziękował: 10 razy
Pomógł: 62 razy

[c++] definiowanie funkcji składowej

Post 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?
Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

[c++] definiowanie funkcji składowej

Post autor: pool »

chyba wiem o co chodzi, ale dopiero zaczynam się tego języka uczyć i byłbym wdzięczny za napisanie kodu.
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[c++] definiowanie funkcji składowej

Post 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.
Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

[c++] definiowanie funkcji składowej

Post 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...:/
Ostatnio zmieniony 6 cze 2009, o 20:37 przez pool, łącznie zmieniany 1 raz.
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[c++] definiowanie funkcji składowej

Post 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:
Ukryta treść:    
Jeśli ktoś ma lepszy pomysł na ciało konstruktora, to chętnie zobaczę.
Tomcat
Użytkownik
Użytkownik
Posty: 327
Rejestracja: 23 mar 2009, o 21:51
Płeć: Mężczyzna
Lokalizacja: Świdnica
Podziękował: 10 razy
Pomógł: 62 razy

[c++] definiowanie funkcji składowej

Post 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
Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

[c++] definiowanie funkcji składowej

Post 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;
};
??
Tomcat
Użytkownik
Użytkownik
Posty: 327
Rejestracja: 23 mar 2009, o 21:51
Płeć: Mężczyzna
Lokalizacja: Świdnica
Podziękował: 10 razy
Pomógł: 62 razy

[c++] definiowanie funkcji składowej

Post autor: Tomcat »

Wskaźnik na znak? To chyba powinno być char*
qw3r
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 7 cze 2009, o 13:40
Płeć: Mężczyzna

[c++] definiowanie funkcji składowej

Post autor: qw3r »

moze wytlumaczyc mi ta linije:

Kod: Zaznacz cały

 Imie = new char[strlen(I)+1];
z gory dziekuje .
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[c++] definiowanie funkcji składowej

Post 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'
Krev
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 2 cze 2009, o 20:00
Płeć: Mężczyzna

[c++] definiowanie funkcji składowej

Post autor: Krev »

Szemek pisze: strlen - funkcja ta zwraca długość ciągu znaków
jakas roznica od string.length() ?
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[c++] definiowanie funkcji składowej

Post 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
Krev
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 2 cze 2009, o 20:00
Płeć: Mężczyzna

[c++] definiowanie funkcji składowej

Post 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
Awatar użytkownika
pool
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 11 lis 2007, o 11:41
Płeć: Mężczyzna
Lokalizacja: z google :]
Podziękował: 78 razy

[c++] definiowanie funkcji składowej

Post 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:))
Ostatnio zmieniony 11 cze 2009, o 19:22 przez pool, łącznie zmieniany 5 razy.
ODPOWIEDZ