我有一个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}}?
答案 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);
因此,对原始对象的更改不会影响您附加到容器的对象。
确保您更好地了解何时复制对象。
供参考: