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

przeniesienie obiektu do innej metody

Ostatnio zmodyfikowano 2016-09-05 14:33
Autor Wiadomość
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.
C/C++
#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() //definicja konstruktora
{
    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: //dodaj rekord
            {
                Pilkarz p1; //obiektem jest p1, wedlug przepisu(klasy) o nazwie pilkarz.
                p1.dodaj_pilkarza();
                p1.wyswietl_dane();
            } // ZAPAMIĘTAĆ: jak w case nie dam klamerek to klasa nie będzie chciała się wykonać
            continue;
        case 2: //usun rekord
            {
                cout << "opcja 2<<" << endl;
               
            }
            continue;
        case 3: //wyswietl rekordy
            {
                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();
   
    // system("pause");
    return 0;
}
P-151372
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?

P-151373
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 ?
P-151374
karambaHZP
» 2016-09-03 10:58:39
C/C++
struct Pilkarz {
    // imię, nazwisko itd
   
    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.
P-151375
hunter44
Temat założony przez niniejszego użytkownika
» 2016-09-03 12:50:04
Dzięki, przeanalizuję i postaram się to zrozumieć.
P-151382
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.
C/C++
#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" ); // konstruktor.
    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:
C/C++
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ć :/
P-151388
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:
C/C++
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:
C/C++
#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" ); // konstruktor.
    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;
}
P-151389
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ł:
C/C++
#include <iostream>
#include <string>
#include <set>
using namespace std;

struct Player { // struktura przechowuje dane piłkarza, oraz ma zdefiniowaną funkcję wypełniającą pola struktury
    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;
    }
};

// to jest komparator, bez którego std::set nie będzie umiał porównać obiektów Player
// dla std::vector nie potrzebny jest komparator
class ComparePlayers {
public:
    bool operator ()( const Player & left, const Player & right ) {
        return left.surname < right.surname;
    }
};

// w klasie, jako atrybut jest kontener std::set, dzięki deklaracji kontenera w klasie
// a nie w metodzie, kontener jest znany we wszystkich metodach i funkcjach zaprzyjaźnionych z klasą
class SoccerTeam {
    set < Player, ComparePlayers > team; // zamiast std::set<> może być std::vector<>
public:
    // konstruktory mogą zostać domyślne, jak jest teraz
    void appendSoccerPlayer() {
        Player player; // lokalna deklaracja obiektu
        cin >> player; // użycie przeciążonego operator>> ze struktury (wypełnia pola struktury)
        team.insert( player ); // dodaje obiekt do kontenera
    }
   
    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; // deklaracja obiektu klasy (z kontenerem)
    soccerTeam.appendSoccerPlayer(); // dodaj piłkarza
    soccerTeam.appendSoccerPlayer();
    cout << soccerTeam << '\n'; // użycie przeciążonego operator>> z klasy, wypisuje w pętli zawartość kontenera
}

Edit: Jeśli, czegoś w tym nie rozumiesz, to pytaj.
P-151391
« 1 » 2 3
  Strona 1 z 3 Następna strona