 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Joachim Praetorius Guest
|
Posted: Mon Nov 03, 2003 8:20 am Post subject: Problem: Objekte bleiben nicht im Vector |
|
|
Hallo,
ich hänge im Moment an einem Problem, dem ich seine Wirkungsweise -
wohl wegen mangelndem Umfang an C++ Wissen - nicht entnommen bekomme.
Ich produziere - einfach gesagt - eine Menge an Punkten und eine Menge
an Objekten (Zellen), die diese enthalten sollen. Da dies auf
verschiedene Weisen geschehen kann werden sowohl die Punkte, als auch
die Zellen einzeln erzeugt und später zusammengeführt.
Zu diesem Zweck enthalten die Zellen einen std::vector in den ich die
Punkte einfüge um sie später - wenn ich alle Punkte verteilt habe -
ausgeben zu können.
Nun stellt sich das Problem, daß zu diesem späteren Zeitpunkt der
Vector der Zellen keine Punkte mehr enthält, obwohl dieses nach der
Zuweisung der Fall ist. Meine Frage ist also: Wo gehen meine Punkte
verloren ??
Ein wenig Beispielcode zur Verdeutlichung der Situation:
--
ThreeClusterGenerator* tg = new ThreeClusterGenerator();
vector<Cluster*> c;
vector<Cell> cl;
vector<Cell> cl2;
/* ZELLEN WERDEN ERZEUGT */
cerr<<"***Creating Cluster";
c = tg->createCluster(2,10);
cerr<<"t[done]" <
PerCellUniTerminalGenerator* ptg = new
PerCellUniTerminalGenerator();
vector
cerr<
/*PUNKTE WERDEN ERZEUGT */
cerr<<"***Creating Terminals";
t = ptg->createTerminals(10,10.0);
cerr<<"t[done]" <
cerr<<"***Adding terminals" <
for(int i=0;i
cl = c[i]->getCells();
for(int j=0;j<cl.size();j++){
for(int k=0;k
/*PUNKTE WERDEN ZUGEWIESEN */
cl[j].addTerminal(t[k]);
}
/* AN DIESER STELLE STIMMT DIE AUSGABE */
cerr<<"Cell has now " <
Terminals" <
/* DAS WAR EIN TEST */
cl2.push_back(cl[j]);
}
}
cerr<<"***Output" <
for(int i=0;i
cl = c[i]->getCells();
for(int j=0;j<cl.size();j++){
/* UND HIER SIND KEINE PUNKTE MEHR DA ! */
cerr<<"Cell has " <
Terminals" <
}
}
cerr<
cerr<<"***2nd try Output" <
for(int i=0;i
/* HIER ALLERDINGS SCHON */
cerr<<"Cell has " <
Terminals" <
}
return 0;
}
--
Wie eingeschrieben: An der ersten Ausgabe (direkt nach der Zuweisung)
sind die Punkte noch da, der zweite Vector gibt sie auch nach der
kompletten Zuweisung wieder aus, nur dir Original-Objekte leider
nicht.
Die addTerminal-Methode sieht so aus:
--
Cell::addTerminal(Terminal t){
int i = terminals.size();
t.setAPName(getName());
t.setName(i);
t.setX(t.getX() + center.getX());
t.setY(t.getY() + center.getY());
terminals.push_back(t);
}//addTerminal
und terminals ist schließlich der std::vector der Klasse, der im
Header definiert wird über
--
private:
vector
--
Bin für jegliche Hinweise dankbar...
grüße,
joachim
--
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Nov 03, 2003 12:27 pm Post subject: Re: Problem: Objekte bleiben nicht im Vector |
|
|
Joachim Praetorius wrote:
| Quote: |
--
ThreeClusterGenerator* tg = new ThreeClusterGenerator();
vector<Cluster*> c;
vector<Cell> cl;
|
cl ist eine eigenstaendiges Objekt.
| Quote: | vector<Cell> cl2;
/* ZELLEN WERDEN ERZEUGT */
cerr<<"***Creating Cluster";
c = tg->createCluster(2,10);
cerr<<"t[done]" <
PerCellUniTerminalGenerator* ptg = new
PerCellUniTerminalGenerator();
vector
cerr<
/*PUNKTE WERDEN ERZEUGT */
cerr<<"***Creating Terminals";
t = ptg->createTerminals(10,10.0);
cerr<<"t[done]" <
cerr<<"***Adding terminals" <
for(int i=0;i
cl = c[i]->getCells();
|
Dieses cl wird nun mit einer Kopie von c[i]->getCells
zunaechst mal vorbelegt.
| Quote: | for(int j=0;j<cl.size();j++){
for(int k=0;k
/*PUNKTE WERDEN ZUGEWIESEN */
cl[j].addTerminal(t[k]);
|
dann fuegst Du Objekte in cl ein. Schoen und gut. Nur hat cl nichts mehr
mit c[i]->getCells() zu tun, denn cl ist ja ein eigenstaendiges Objekt. Du
fuegst also Deine Terminal Objekte zwar in cl ein, nicht aber in c[i]->getCells().
| Quote: | }
/* AN DIESER STELLE STIMMT DIE AUSGABE */
cerr<<"Cell has now " <
Terminals" <
|
logisch. Muss so sein.
| Quote: | /* DAS WAR EIN TEST */
cl2.push_back(cl[j]);
}
}
cerr<<"***Output" <
for(int i=0;i
cl = c[i]->getCells();
|
Dann allerdings weist Du cl einen neuen Inhalt zu, naemlich alles was in
c[i]->getCells gespeichert ist. Dadurch geht natuerlich der alte Inhalt von
cl verloren ...
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Nov 03, 2003 12:33 pm Post subject: Re: Problem: Objekte bleiben nicht im Vector |
|
|
Karl Heinz Buchegger wrote:
| Quote: |
Joachim Praetorius wrote:
--
ThreeClusterGenerator* tg = new ThreeClusterGenerator();
vector<Cluster*> c;
vector<Cell> cl;
cl ist eine eigenstaendiges Objekt.
vector<Cell> cl2;
/* ZELLEN WERDEN ERZEUGT */
cerr<<"***Creating Cluster";
c = tg->createCluster(2,10);
cerr<<"t[done]" <
PerCellUniTerminalGenerator* ptg = new
PerCellUniTerminalGenerator();
vector
cerr<
/*PUNKTE WERDEN ERZEUGT */
cerr<<"***Creating Terminals";
t = ptg->createTerminals(10,10.0);
cerr<<"t[done]" <
cerr<<"***Adding terminals" <
for(int i=0;i
cl = c[i]->getCells();
Dieses cl wird nun mit einer Kopie von c[i]->getCells
zunaechst mal vorbelegt.
|
Also: vom i-ten Cluster alle Zellen.
| Quote: |
for(int j=0;j<cl.size();j++){
for(int k=0;k
/*PUNKTE WERDEN ZUGEWIESEN */
cl[j].addTerminal(t[k]);
dann fuegst Du Objekte in cl ein. Schoen und gut. Nur hat cl nichts mehr
mit c[i]->getCells() zu tun, denn cl ist ja ein eigenstaendiges Objekt. Du
fuegst also Deine Terminal Objekte zwar in cl ein, nicht aber in c[i]->getCells().
|
Du fuegst zwar Terminal Objekt in cl ein, nicht jedoch in den i-ten Cluster in c.
| Quote: |
}
/* AN DIESER STELLE STIMMT DIE AUSGABE */
cerr<<"Cell has now " <
Terminals" <
logisch. Muss so sein.
/* DAS WAR EIN TEST */
cl2.push_back(cl[j]);
}
}
cerr<<"***Output" <
for(int i=0;i
cl = c[i]->getCells();
Dann allerdings weist Du cl einen neuen Inhalt zu, naemlich alles was in
c[i]->getCells gespeichert ist. Dadurch geht natuerlich der alte Inhalt von
cl verloren ...
|
cl kriegt eine neue Belegung vom i-ten Cluster.
Die Terminologie da oben hab ich etwas verbockt. Das grundsatzliche Problem aber bleibt:
cl ist eine lokale Variable, wenn Du cl manipulierst, so ist das dem i-ten Cluster
piepschnurzegal.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Joachim Praetorius Guest
|
Posted: Mon Nov 03, 2003 2:31 pm Post subject: Re: Problem: Objekte bleiben nicht im Vector |
|
|
Karl Heinz Buchegger wrote:
| Quote: | cl ist eine eigenstaendiges Objekt.
_DAS_ wars was mir irgendwie fehlte. Zuviel Java-Eingewöhnung..  |
Danke.
| Quote: |
Dieses cl wird nun mit einer Kopie von c[i]->getCells
zunaechst mal vorbelegt.
Also: vom i-ten Cluster alle Zellen.
Du fuegst zwar Terminal Objekt in cl ein, nicht jedoch in den i-ten Cluster in c.
cl kriegt eine neue Belegung vom i-ten Cluster.
Die Terminologie da oben hab ich etwas verbockt. Das grundsatzliche Problem aber bleibt:
cl ist eine lokale Variable, wenn Du cl manipulierst, so ist das dem i-ten Cluster
piepschnurzegal.
|
Ich hatte es auch beim ersten Mal dann begriffen. Nochmal: vielen Dank
fürs Tomaten von den Augen nehmen. Wenn ich an der Stelle nen Pointer
nehme und den dann eifrig dereferenziere sollte ich hinkommen, denke
ich?
Gut, jetzt weiß ich wo ich weiterzusuchen habe...
joachim
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|