Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Tworzenie obiektów klasy A przy użyciu metody z klasy B

Ostatnio zmodyfikowano 2024-04-10 17:57
Autor Wiadomość
Raddito
Temat założony przez niniejszego użytkownika
[C++] Tworzenie obiektów klasy A przy użyciu metody z klasy B
» 2024-04-10 01:17:42
Mój program ma takie zadanie:
1. Klasa Pracownik z 2 polami prywatnymi, nazwisko i pensja.
2. Klasa Manager z 2 metodami zaprzyjaźnionymi do pokazywania oraz zmiany pól obiektów klasy Pracownik oraz metoda do stworzenia obiektu klasy Pracownik.
Mój problem polega na tym, że wszystko działa, ale prowadzący jako "wskazówkę" napisał, że metoda Managera powinna zwracać wskaźnik na Pracownika. I nie rozumiem dlaczego.

Plik nagłówkowy:
C/C++
#ifndef Pracownik_h
#define Pracownik_h

using namespace std;

class Pracownik;

class Manager
{
public:
   
Manager();
   
~Manager();
   
void wyswietl( Pracownik p );
   
void zmien( Pracownik & p, string nazwisko, int pensja );
   
Pracownik Stworz( string n, int p );
};

class Pracownik
{
private:
   
string nazwisko;
   
int pensja;
   
friend void Manager::wyswietl( Pracownik p );
   
friend void Manager::zmien( Pracownik & p, string n, int pensja );
public:
   
   
Pracownik( string n, int p );
   
~Pracownik();
};

#endif
Plik źródłowy + main:
C/C++
#include <iostream>
#include "Pracownik.h"

using namespace std;

void Manager::wyswietl( Pracownik p )
{
   
cout << "Nazwisko pracownika: " << p.nazwisko << endl;
   
cout << "Pensja pracownika: " << p.pensja << endl;
};
void Manager::zmien( Pracownik & p, string n, int p2 )
{
   
p.nazwisko = n;
   
p.pensja = p2;
}
Manager::Manager() { }
Manager::~Manager() { }
Pracownik Manager::Stworz( string n, int p )
{
   
Pracownik prac = Pracownik( n, p );
   
return prac;
}
Pracownik::Pracownik( string n, int p )
{
   
nazwisko = n;
   
pensja = p;
}
Pracownik::~Pracownik() { }
C/C++
#include <iostream>
#include "Pracownik.h"
using namespace std;

int main()
{
   
Pracownik p1( "Kowalski", 15000 );
   
Manager m1;
   
m1.wyswietl( p1 );
   
m1.zmien( p1, "John", 10000 );
   
m1.wyswietl( p1 );
   
Pracownik p2 = m1.Stworz( "Johnislaw3", 1000 );
   
m1.wyswietl( p2 );
   
m1.zmien( p2, "Twoja", 5000 );
   
m1.wyswietl( p2 );
   
return 0;
}
Wszystko ładnie się kompiluje. Jeśli zmienię wszystko na wskaźniki też mi działa, ale pytanie po co? Czego złego nie widzę w metodzie Stwórz i czemu prowadzący napisał aby metoda ta zwracała Pracownik*?
Będzie wdzięczny za pomoc.
P-180970
DejaVu
» 2024-04-10 15:18:40
Może po prostu wykładowca chce Was czegoś nauczyć (np. zarządzaniem pamięcią). Obecnie Manager nie pełni żadnej roli w Twoim kodzie, bo nie zarządza żadnymi obiektami. Równie dobrze mógłbyś przenieść wszystkie metody menedżera do klasy Pracownik lub zrobić wszystkie metody statycznymi w klasie Manager co zobrazuje Ci problem koncepcyjny Twojego kodu.

Generalnie rzecz biorąc jak już na tak prostym zagadnieniu jesteś zmuszony do używania friend, to już z góry można powiedzieć, że ten kod nie jest dobrze zaprojektowany i nie będzie się nadawał do utrzymania w kodzie produkcyjnym. Niemniej jednak zajęcia są po to, abyście poznali koncepty języka programowania więc... pytaj wykładowcy czego chce Was nauczyć i co pokazać, bo praktycznego zastosowania ten kod nie ma.
P-180971
Raddito
Temat założony przez niniejszego użytkownika
» 2024-04-10 16:54:54
Tzn. To jest dokładna treść zadania:
Na ocenę 3:

    Proszę o napisanie klasy Pracownik zawierającej dwa poa prywatne (np. nazwisko i pensja)
    Utworzenie wewnątrz klasy publicznej metody wypisującej obecne wartości pól prywatnych
    Utworzenie metody zaprzyjaźnionej która przypisze nowe wartości do pól prywatnych

Na ocenę 4:

    Wykonanie zadań z oceny 3
    Rozdzielenie definicji oraz implementacji na pliki źródłowe i nagłówkowe
    Usunięcie publicznej metody z klasy Pracownik i utworzenie dodatkowej klasy zaprzyjaźnionej wykonującej funkcje usuwanej metody publicznej [np. string Pracownik::wyświetl() => friend string wyświetl(&Pracownik pracownik)]

Na ocenę 5:

    Wykonanie zadań z oceny 4
    Utworzenie klasy Manager
    Metody prywatne z zadania na ocenę 4 mają być wrzucone w klasę Manager (metody wyświetlające pola Pracownik oraz przypisujące wartości do pól klasy Pracownik)
    Utworzenie w klasie Manager metody która utworzy oraz zwróci nowy obiekt Pracownik. Ważne: metoda ta powinna zawierać znacznik w typie zwracanym (tzn. Pracownik*) aby uniknąć błędów w stylu

    error: invalid conversion from ‘Pracownik*’ to ‘int’ [-fpermissive]

    error: base operand of ‘->’ has non-pointer type ‘Pracownik’



Więc to, że kod nie ma żadnego zastosowania to zdaje sobie sprawę, moje pytanie polega na tym jaka jest różnica, lub czemu jest to złe, aby metoda Managera zwracała obiekt a nie wskaźnik na obiekt?
P-180972
DejaVu
» 2024-04-10 17:57:47
Porozmawiaj z kolegami z semestru co autor miał na myśli - może ktoś coś słyszał/widział/dopytał.

Wskaźniki są po to, aby unikać kopiowania obiektów, ale z drugiej strony są źródłem wycieków pamięci. Nowoczesny kod C++ raczej używałby również std::shared_ptr, a nie prymitywnych wskaźników więc... trudno dać Ci 'poprawnie polityczną odpowiedź', aby była zgodna z wolą wykładowcy, bo na pewno nie jest ona przykładem 'dobrego' projektowania kodu.

Zapewne musisz podejść do zadania w stylu: 'wymagania są zdefiniowane, trzeba zrobić, a czy ma to sens - tylko wykładowca wie'.
P-180973
« 1 »
  Strona 1 z 1