Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Vektor bzw. Zeiger darauf zurückgeben?
i_hasser
05.06.2004, 18:42
Hi
Will eine Funktion die einen Zeiger auf einen kompletten Vektor zurückgibt (also nicht nur der Iterator, das ist mir zu unsauber).
So würde ich mir den Syntax vorstellen, leider stellt sich gcc die Sache anscheinend etwas anders vor :(:
vector<std::string> *fkt();
Ich bin im Netz über die Möglichkeit das mit dem Iterator zu machen gestollpert, aber wie gesagt, das ist (mir) zu unsauber.
i_hasser
05.06.2004, 19:03
Hat sich erledigt, hatte nur das std:: vergessen.
std::vector<std::string> *fkt()
funktioniert problemlos.
Scapular
11.03.2006, 11:43
Hallo i_hasser,
habe auch das Problem das ich ein Zeiger auf ein Vector zurückgeben will.
nur meckert der immer bei mir rum (beim return):
return &Liste[i];
die Fuktion Rückgabe sieht so aus:
vector<struct> *fkt(const vector<struct>& Liste ...);
(using namespace std; ist gesetzt.)
ich glaube ich mach beim Return nen Fehler, ich komm einfach mit der Syntax noch nicht so richtig zurecht.
Würde mich sehr freuen wenn mir einer mal sein return zeigen könnte.(besser noch nen kleines Beispiel ;D )
i_hasser
11.03.2006, 14:34
So wie es dasteht, gibst du aber einen Zeiger auf ein Element des Vektors zurück, und nicht einen Zeiger auf den gesamten Vektor.
Das sähe dann so aus:
return &Liste;
Allerdings... was soll "struct" sein? Eigentlich müsste das eines der wenigen reservierten Schlüsselwörter sein die du nicht nehmen kannst.
Scapular
11.03.2006, 15:18
soo,
also struct war nicht wörtlich gemeint (eine Struktur von C++)
so jetzt zum Problem: ich hab also ein dynamischen Vector und als Typ eine Struktur angegeben also damit ich z.B. soetwas schreiben kann:
cout<<v1[i].name;
wenn ich nen Zeiger darauf packe geht das ja auch jetzt ... also kann ich die Daten im Vector ändern ..... nur wenn ich jetzt den Vector erweitern will (mit push_back) findet er den Zeiger nicht mehr ... wieso ???
es muss doch eine Möglichkeit geben sich eine Stelle im Vector zu merken auch wenn er dynamisch ist.
i_hasser
11.03.2006, 15:21
Schreib mal Code und Fehlermeldung. Auf irgendwelche Sachen von Zeigern musst du per -> zugreifen oder vorher dereferenzieren, also zB. so:
clas A
{
public:
int abc();
int x;
}
int main()
{
A a;
a.abc();
a.x;
A* p=&a;
p->abc();
p->x;
(*p).abc();
(*p).x;
return 0;
}
Scapular
11.03.2006, 15:38
struct User
{
string name1;
string name2;
};
int main()
{
vector<User> Liste;
User admin={"Name1","Name2"};
Liste.push_back(admin);
User* p_me;
p_me=&Liste[0];
cout<<p_me->name1;
Liste[0].name1="NeuName1";
cout<<p_me->name1; // das geht ja auch noch
User user2={"Name3","Name4"};
Liste.push_back(user2);
cout<<p_me->name1; // das jetzt nicht mehr
}
i_hasser
11.03.2006, 15:46
Du verwechselst da ein paar Sachen. Vektoren sind keine Arrays. Vektoren sind eine Klasse wie jede andere auch (nur mit Templates aufgepeppt), die den operator[] enthält, mit dem Zugriffe ala a[123] möglich werden.
User* p_me;
p_me=Liste[0];
Da fehlt ein &, denn der opterator[] von deinem Vektor gibt den Typ User zurück, nicht User*. Nimm vorsichtshalber Klammer, also "p_me=&(Liste[0]);" dann wird auf den ersten Blick deutlich, was gemeint ist. Ich weis net was für einen Compiler du nimmst, aber anscheinend hat der das schon automatisch gemacht, weil es sonst einen Fehler geben müsste.
Was du willst, kannst du am besten über "vector<User*>" realisieren, denn da kommt es nur auf den Wert der Elemente im Vektor an, nicht auf deren Position. Das sähe dann ungefähr so aus:
vector<User*> Liste;
User* admin=new User{"Name1","Name2"}; // musst gucken ob das so geht, ansonstne schreib einen passenden Konstruktor
Liste.push_back(admin);
User* p_me;
p_me=Liste[0];
cout<<p_me->name1;
Liste[0]->name1="NeuName1";
cout<<p_me->name1;
User* user2=new User{"Name3","Name4"};
Liste.push_back(user2);
cout<<p_me->name1; // das geht dann auch noch
Scapular
11.03.2006, 16:15
Ahh jaa es funkst,
jeah na endlich ... Danke ...
PS. das & hatte ich nur vergessen abzuschreiben ;)
vBulletin® v3.8.7, Copyright ©2000-2012, vBulletin Solutions, Inc.