hunter44 Temat założony przez niniejszego użytkownika |
przeniesienie obiektu do innej metody » 2016-09-03 10:20:23 Witam. Chcę w ramach ćwiczeń zrobić program, który stworzy listę obiektów. W pierwszej metodzie wpisujemy dane, jest tworzony obiekt i wpisywany na listę. W drugiej metodzie można wyświetlić wszystkie obiekty jakie stworzyliśmy. Jak wiadomo wszystko co dzieje się w funkcji lub metodzie jest kasowane od razu po jej zakończeniu. Dla tego w metodzie dodaj_pilkarza użyłem wskaźnika, po to aby w metodzie wyswietl_dane pokazaly sie wszystkie stworzone obiekty. Niestety tak sie nie dzieje. Pomoże ktoś ? Próbowałem użyć nawet wskaźnika this, ale również nieumiejętnie. Poniżej zamieszczam cały kod. #include<iostream> #include <string> #include <process.h> #include <list> #include <cstddef>
using namespace std;
class Pilkarz { public: string imie; string nazwisko; int wiek; string pozycja; Pilkarz(); ~Pilkarz(); void dodaj_pilkarza() { Pilkarz * p1 = new Pilkarz; list < Pilkarz > baza; list < Pilkarz >::iterator i; int nr = 1; cout << "DODAWANIE PILKARZA" << endl; cout << "Podaj imie: "; cin >> p1->imie; cout << "Podaj nazwisko: "; cin >> p1->nazwisko; cout << "Podaj wiek: "; cin >> p1->wiek; cout << "Podaj pozycje: "; cin >> p1->pozycja; baza.push_back( * p1 ); cout << p1->imie << " " << p1->nazwisko << ", " << p1->pozycja << ", lat: " << p1->wiek << endl; } void wyswietl_dane() { Pilkarz p1; list < Pilkarz > baza; list < Pilkarz >::iterator i; int nr = 1; for( i = baza.begin(); i != baza.end(); i++ ) { for( i = baza.begin(); i != baza.end(); i++ ) p1 = * i; cout << nr << p1.imie << " " << p1.nazwisko << ", " << p1.pozycja << ", lat: " << p1.wiek << endl; nr++; } } }; Pilkarz::Pilkarz() { cout << "default" << endl; imie = "Jan"; nazwisko = "Kowalski"; wiek = 20; pozycja = "napastnik"; } Pilkarz::~Pilkarz() { cout << "Destrukto dziala !" << endl; }
void menu() { int odp = 0; do { cout << "-------------------------" << endl; cout << "--- Co chcesz zrobic: ---" << endl; cout << "| 1. Dodaj rekord |" << endl; cout << "| 2.Usun rekord |" << endl; cout << "| 3. Wyswietl rekordy |" << endl; cout << "| 4. Zapisz do pliku |" << endl; cout << "| 5. Wczytaj z pliku |" << endl; cout << "| 6. Zakoncz program |" << endl; cout << "-------------------------" << endl; cin >> odp; switch( odp ) { case 1: { Pilkarz p1; p1.dodaj_pilkarza(); p1.wyswietl_dane(); } continue; case 2: { cout << "opcja 2<<" << endl; } continue; case 3: { Pilkarz p1; p1.wyswietl_dane(); } continue; case 4: { cout << "opcja 4<<" << endl; } continue; case 5: { cout << "opcja 5<<" << endl; } continue; case 6: { cout << "opcja 6<<" << endl; } break; default: cout << "Wybrano bledny numer. Prosze podac wartosc z zakresu od 1 do 7."; } break; } while( odp != 6 ); }
int main() { menu(); return 0; }
|
|
karambaHZP |
» 2016-09-03 10:43:51 Zrób strukturę z danymi piłkarza. Zrób klasę, której składową będzie kontener struktur, wtedy każda metoda ma dostęp do kontenera.
Obecnie używasz kontenera tylko lokalnie.
Edit: Temat ma niewiele wspólnego z problemem. Twoim problemem jest: Jak używać kontenera jako składowej klasy? |
|
hunter44 Temat założony przez niniejszego użytkownika |
» 2016-09-03 10:48:44 "klasę, której składową będzie kontener struktur" - Możesz to jakoś bardziej wyjaśnić ? Czyli robie strukture, wprowadzam do niej dane pilkarzy, potem tworze klase i tak jakby "przesyłam" dane ze struktury do klasy ? |
|
karambaHZP |
» 2016-09-03 10:58:39 struct Pilkarz { friend istream & operator <<( istream & wej, Pilkarz & pilkarz ); };
class Druzyna { vector < Pilkarz > druzyna; public: void dodajOilkarza(); friend ostream & operator <<( ostream & wyj, const Druzyna & druzyna ); }; Tak trochę na skróty, bo na smartfonie drukuję, ale ogólny zarys jest. Edit: W sumie to można by użyć kontenera z sortowniem (np.std::set), tylko trzeba mu napisać komparator. |
|
hunter44 Temat założony przez niniejszego użytkownika |
» 2016-09-03 12:50:04 Dzięki, przeanalizuję i postaram się to zrozumieć. |
|
hunter44 Temat założony przez niniejszego użytkownika |
» 2016-09-03 15:05:06 Poczytałem o funkcjach zaprzyjaźnionych i zacząłem pisać od nowa. Na początku chciałem wprowadzić tylko dane jednego pilkarza i od razu oddzielną funkcją wyświetlić te dane, żeby sprawdzić, że istnieje "przyjaźń". I znowu problemy. #include<iostream> #include <string> #include <process.h> #include <list> #include <cstddef>
using namespace std;
class Pilkarz { private: string imie; string nazwisko; int wiek; string pozycja; public: Pilkarz( string = "Jan", string = "kowalski", int = 20, string = "Napastnik" ); Pilkarz::Pilkarz( string a, string b, int c, string d ) { imie = a; nazwisko = b; wiek = c; pozycja = d; } friend void wyswietl( Pilkarz p ); void Pilkarz::dodaj_pilkarza() { cout << "Imie: "; cin >> a; cout << "Nazwisko: "; cin >> b; cout << "Wiek: "; cin >> c; cout << "Pozycja: "; cin >> d; } }; void wyswietl( Pilkarz p ) { cout << p.imie << " " << p.nazwisko << ", " << p.pozycja << ", lat: " << p.wiek << endl; } int main() { Pilkarz p1; p1.dodaj_pilkarza(); cout << "wprowadzone dane" << endl; wyswietl( p1 ); return 0; }
Otrzymuję takie błędy: identifier a, b, c, d is undefined oraz a, b, c, d undeclarated. Błąd ten wskazuje dokładnie na metode void Pilkarz::dodaj_pilkarza() Oraz błąd numer 2: Error C2535 'Pilkarz::Pilkarz(std::string,std::string,int,std::string)': member function already defined or declared
Pierwszy błąd mogę rozwiązać jeśli zadeklaruje a,b,c,d globalnie, przed rozpoczęciem klasy, ale czy tak będzie poprawnie ? Co do drugiego błędu to nie mam pojęcia jak to naprawić :/ |
|
hunter44 Temat założony przez niniejszego użytkownika |
» 2016-09-03 15:22:09 Dobra, olejcie poprzednią wiadomość. Pierwszy błąd ze zmiennymi a,b,c,d okazał się banalny. Został tylko błąd nr 2: Error C2535 'Pilkarz::Pilkarz(std::string,std::string,int,std::string)': member function already defined or declared
Coś czuję, że on też jest banalny. Poniżej zamieszczam jeszcze raz aktualny kod: #include<iostream> #include <string> #include <process.h> #include <list> #include <cstddef>
using namespace std;
class Pilkarz { private: string imie; string nazwisko; int wiek; string pozycja; public: Pilkarz( string = "Jan", string = "kowalski", int = 20, string = "Napastnik" ); Pilkarz::Pilkarz( string a, string b, int c, string d ) { imie = a; nazwisko = b; wiek = c; pozycja = d; } friend void wyswietl( Pilkarz p ); void Pilkarz::dodaj_pilkarza() { cout << "Imie: "; cin >> imie; cout << "Nazwisko: "; cin >> nazwisko; cout << "Wiek: "; cin >> wiek; cout << "Pozycja: "; cin >> pozycja; } }; void wyswietl( Pilkarz p ) { cout << p.imie << " " << p.nazwisko << ", " << p.pozycja << ", lat: " << p.wiek << endl; } int main() { Pilkarz p1; p1.dodaj_pilkarza(); cout << "wprowadzone dane" << endl; wyswietl( p1 ); return 0; }
|
|
carlosmay |
» 2016-09-03 15:32:32 Pierwszy błąd mogę rozwiązać jeśli zadeklaruje a,b,c,d globalnie, przed rozpoczęciem klasy, ale czy tak będzie poprawnie ? |
Zmienne globalne to zło. Ogólnie nie wiem co tam kombinujesz, ale tak nie dodasz "Pilkarza". Co do drugiego błędu to nie mam pojęcia jak to naprawić :/ |
Masz konstruktory, których kompilator nie rozróżnia, dla wywołania z argumentami. Ogólnie błądzisz po omacku i kombinujesz na chybił trafił: #include <iostream> #include <string> #include <set> using namespace std;
struct Player { string name; string surname; unsigned age; string positionOnThePitch; friend istream & operator >>( istream & is, Player & player ) { is >> player.name >> player.surname >> player.age >> player.positionOnThePitch; return is; } };
class ComparePlayers { public: bool operator ()( const Player & left, const Player & right ) { return left.surname < right.surname; } };
class SoccerTeam { set < Player, ComparePlayers > team; public: void appendSoccerPlayer() { Player player; cin >> player; team.insert( player ); } friend ostream & operator <<( ostream & os, const SoccerTeam & soccerTeam ) { for( auto const & elem: soccerTeam.team ) { os << elem.name << ' ' << elem.surname << "\nwiek " << elem.age << "\npozycja" << elem.positionOnThePitch << '\n'; } return os; } };
int main() { SoccerTeam soccerTeam; soccerTeam.appendSoccerPlayer(); soccerTeam.appendSoccerPlayer(); cout << soccerTeam << '\n'; } Edit: Jeśli, czegoś w tym nie rozumiesz, to pytaj. |
|
« 1 » 2 3 |