以c ++存储数据的概念

时间:2014-03-11 11:40:48

标签: c++

我有一个Spieler类和一个Verein类,其中包含Spieler个成员的向量。 现在,如果我通过在播放器类中使用此类的函数来更改Players的某些内容,例如Staerke(强度为德语),则它不会自动更改此播放器的值。 这是代码:

#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;
}

我对c ++和编程很陌生,所以代码可能很糟糕。 猜测它与指针有关,我真的没有考虑用c ++存储数据的概念,试图通过试用和试用来获得它。错误;那么如何以Staerke Team中更改Playerlist的方式更改{{1}}?

2 个答案:

答案 0 :(得分:2)

问题是你是在向量中存储完整对象而不是指针。当你运行这一行时:

spieler.emplace_back(Spieler1);

制作Spieler1的副本并将其放入向量中。因此,在main中修改它将对向量没有影响。同样不是在Verein类中设置时复制向量。

你应该使用指针,如果这是你所追求的或更好的,但有一个函数来修改Verein类的强度,因为参数可能是一个好主意。像这样:

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

如果您可以访问C ++ 11,那么它可以更优雅。

答案 1 :(得分:1)

因此,您将向量中的副本传递并存储到对象中:

Team1.setSpielerListe(spieler);

因此,对原始矢量和所包含对象的更改不会影响该成员。

此外,我对emplace_back没有太多经验,但将对象追加到std::vector的更常用方法也会附加副本:

spieler.push_back(Spieler1);

因此,对原始对象的更改不会影响您附加到容器的对象。

确保您更好地了解何时复制对象。

供参考: