jimbo999
jimbo999

Reputation: 80

Concept of data storing in c++

I have a Spieler class and a Verein class with a vector of Spieler members. Now if I change something of the Players like the Staerke(german for strength) by using a function of this class in the player class it does not automatically change the value for this player. Here is the code:

#include <vector>
#include<iostream>
#include <string>
using namespace std;

class Spieler
{
    public:


        void setinformation(int a, string b, string c, int d)
        {
            ID = a;
            Vorname = b;
            Nachname = c;
            Staerke = d;
        }
        void getinformation()
        {
            cout << "ID: " << ID << endl;
            cout << "Vorname: " << Vorname << endl;
            cout << "Nachname: " << Nachname << endl;
            cout << "Staerke: " << Staerke << endl << endl;
        }
        void setStaerke(int x)
        {
            Staerke = x;
        }

        int getStaerke()
        {
            return Staerke;
        }

    private:

        string Vorname, Nachname;
        int Staerke, ID;

};

class Verein
{
    public:

        void setSpielerListe(vector<Spieler> x)
        {
            Spielerliste = x;
        }

        vector<Spieler> getSpielerListe()
        {
            return Spielerliste;
        }
        string getVereinsName()
        {
            return VereinsName;
        }

        int getVereinsID() const
        {
            return VereinsID;
        }

        void setVereinsID(int x)
        {
            VereinsID = x;
        }
        int getGesamtstaerke()
        {
            Gesamtstaerke = 0;
            vector<Spieler> b;
            b = getSpielerListe();
            for (size_t i = 0; i < b.size(); i++)
            {
                Gesamtstaerke = Gesamtstaerke + b[i].getStaerke();
            }
            return Gesamtstaerke;
        }

        void Vereinsinformationen()
        {
            vector<Spieler> list;
            int id;
            string vereinsname;
            int gesamtstaerke;
            id = getVereinsID();
            vereinsname = getVereinsName();
            gesamtstaerke = getGesamtstaerke();
            list = getSpielerListe();
            cout << "VereinsID: " << id << endl;
            cout << "Vereinsname: " << vereinsname << endl;
            cout << "Gesamstaerke: " << gesamtstaerke << endl << endl;
            cout << "Spieler: " << endl;
            for (size_t i = 0; i < list.size(); i++)
                list[i].getinformation();
        }

    private:
        vector<Spieler> Spielerliste;
        int VereinsID, Gesamtstaerke;
        string VereinsName;

};

vector<Spieler> spieler;
int main()
{
    Spieler Spieler1;
    Spieler1.setinformation(0, "Peter", "Pan", 10);
    spieler.emplace_back(Spieler1);
    Verein Team1;
    Team1.setSpielerListe(spieler);
    Spieler1.setStaerke(20);
    Team1.Vereinsinformationen();
    cin.get();           

    return 0;
}

I'm really new into c++ and programming so the code might be terrible. Guess it has to do with pointers, I'm really not into the concept of storing data in c++, try to get it by trial & error; So how to change the Staerke in a way that it is changed in the Teams Playerlist too?

Upvotes: 0

Views: 105

Answers (2)

moooeeeep
moooeeeep

Reputation: 32512

Hereby you pass and store a copy from the vector into the object:

Team1.setSpielerListe(spieler);

Therefore changes to the original vector and the contained objects will not affect the member.

Further, I don't have much experience with emplace_back, but the more usual way to append an object to a std::vector would also append a copy:

spieler.push_back(Spieler1);

Therefore changes to the original object would not affect the object you've appended to the container.

Make sure you better understand when objects are copied.

For reference:

Upvotes: 1

Eric Fortin
Eric Fortin

Reputation: 7603

The problem is you are storing full object in the vector and not pointers. When you run this line:

spieler.emplace_back(Spieler1);

a copy of Spieler1 is made and put in the vector. So modifying it in the main will have no effect in the vector. Also not that you are copying the vector when setting in Verein class.

You should use pointer if this is what you are after or better yet have a function to modify strength from Verein class taking its id and new strength as parameters might be a good idea. Something like this:

void setStaerke(int id, int x)
{
    vector<Spieler>::iterator it = Spielerliste.begin();
    while (it != Spielerliste.end())
    {
        if ((*it).GetId() == id)
        {
            (*it).setStaerke(x);
            break;
        }
    }
}

If you have access to C++11, it could be made more elegantly.

Upvotes: 2

Related Questions