Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dynamische Liste (STL) in dynamischen Objekt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.07.2006, 21:56 Uhr
mase



Hallo!
Ich hab da ein Problem mit den Templates:

Eine dynamisch erzeugtes Objekt erzeugt ein Listenobjekt aus dem list-Template der STL.

C++:
typedef list<BombLaunch> BombLaunchList;

class Project
{
public:
        Project(string FileName)
        {
                BombList=new BombLaunchList;
        }
        ~Project()
        {
                delete BombList;
        }
...


BombLaunch ist ein weiteres Objekt einer anderen Klasse, der Inhalt der Liste.

An das Hauptprogramm soll ein Zeiger auf die Liste (BombLaunchList) übergeben werden.
Hierzu habe ich eine Zugriffsmethode.

C++:
...
BombLaunchList* Project::getBombs()
{
    return BombList;
}
...


Mein Hauptprogramm soll den Zeiger in der Variable BombList speichern.

C++:
Project Proj;
BombLaunchList* BombList=Proj.getBombs();


Die Elemente der Liste haben nun auch Zugriffsmethoden. Z. B. getBombId
Doch wie komm ich aus dem Hauptprogramm an die Methoden ran?
BombList[n]->getBombId() hat nicht funktioniert. n soll die Position in der Liste sein.
Der Zeiger wird anscheinend richtig gespeichert, jedenfalls enthält BombList eine Adresse.

Eine weitere Frage:
Warum muss im im o. g. Konstruktor schreiben

C++:
BombList=new BombLaunchList;


Wenn ich schreibe

C++:
BombLaunchList* BombList=new BombLaunchList;


dann kommt die Warnung, dass BombList nicht verwendet wird.

Ich hoffe, ich hab mein Problem einigermassen verständlich geschildert, und jemand kann
mir helfen.
--
May the force be with us!

Dieser Post wurde am 19.07.2006 um 21:57 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.07.2006, 22:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
du hast mir meinen letzten Rat, den gültigkeitsbereich von Variablen anzusehen, immer noch nicht beherzigt, sonst hätteste die letzte Frage nicht mehr gestellt bzw wäre diese geklärt.

Also, anhand eines Beispiels:


datei.cpp

C++:
#include <stdio.h>

int a; // global gültig, in allen cpp-dateien

static int b; // global, aber nur in dieser datei (modul) gültig

void funktion()
{
   int c; // nur in dieser funktion gültig und bei jedem aufruf neu
   static int d; // nur in dieser funktion gültig aber bei jedem aufruf identisch

   int b; // <- ab hier gilt obiges b nicht mehr, d.h wenn man jetzt b etwas zuweist, wird das lokale b genommen, nicht das globale!
}

class klasse
{
  int c; // membervariable, für jede instanz der klasse
  static int d; // klassenvariable, für alle instanzen der klasse
  
  void funktion() // lokale funktion
  {
      int e; // lokale variable, nur innerhalb der funktion gültig!
  }
}



Wenn du nun


C++:
class Project
{
public:
        Project(string FileName)
        {
                BombLaunchList *BombList=new BombLaunchList; // lokal
        }
        ~Project()
        {
                delete BombList;
        }
        BombLaunchList *BombList; // member
...



schreibst, ist das im Konstruktor definierte eine NEUE lokale Variable, d.h du weist nur der im Konstruktor definierten "BombList" eine neue instanz zu.
die Membervariable "BombList", wird durch die lokale überdeckt!

Ansonsten, dein anderes Problem ist folgendes: der operator[] gilt nur für list<T>, nicht für einen pointer darauf:


C++:
list<string> A;
list<string> *B = &A;




d.h B[0] zeigt auf A, nicht auf das 0-te element vom inhalt der liste. B[1] würde auf den Speicherbereich A+sizeof(A) zeigen, was in dem fall dann sonst wohin zeigt nur nicht dahin wo gültiger speicher ist.

Wie dem auch sei: du musst entweder dann


C++:
BombList[0][0-x]



schreiben, oder besser:


C++:
(*BombList)[0-x]



oder eben BombList->at(0-x) benutzen (sollte "at" sein, so in der art sollte es heißen)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.07.2006, 10:58 Uhr
mase



Dann stellt sich für mich die Frage, wie kann ich beim Erzeugen des Objekts den Member
initialisieren, also ein dynamisches Objekt "BombList" vom Typ "BombLaunchList"
anlegen? Wird dann durch

C++:
BombList=new BombLaunchList


der Member initialisiert, und durch

C++:
BombLaunchList* BombList=new BombLaunchList


eine neue lokale Variable deklariert und zugewiesen?

Wenn die Zugriffsmethode "getBombId" heisst, komm ich dann über

C++:
(*BombList)[0-x]->getBombId()


an das xte Element ran?
Das klingt für mich nicht so ganz verständlich, im Buch ist das auch nicht so ganz
eindeutig erklärt.
Doch die Sache mit dem Template würde mein Programm doch etwas vereinfachen,
da ich noch eine zweite Liste habe, die ein anderes Objekt einer anderen Klasse
aufnimmt.
--
May the force be with us!

Dieser Post wurde am 20.07.2006 um 11:31 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.07.2006, 11:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Dann stellt sich für mich die Frage, wie kann ich beim Erzeugen des Objekts den Member
initialissieren


Für sowas gibt es ein Konstruktor...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.07.2006, 11:31 Uhr
mase



Ich hab's ja probiert über den Konstruktor, doch dann war sie nur lokal.
Aber wahrscheinlich, weil ich sie neu deklariert hab.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.07.2006, 15:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von mase:
Ich hab's ja probiert über den Konstruktor, doch dann war sie nur lokal.
Aber wahrscheinlich, weil ich sie neu deklariert hab.

genau
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.07.2006, 18:08 Uhr
mase



Nun hab ich aber folgendes:
In meiner project.h hab ich privat deklariert

C++:
BombLaunchList::iterator BombIter;


BombLaunchList entspricht list<BombLaunch> (typedef).

Zu Testzwecken hab ich hier nur begin() verwendet.
BombList ist ein Objekt von BombLaunchList.
BombAdd ist ein Objekt, dass in die Liste soll.

C++:
BombIter=BombList->begin();
BombList->insert(BombIter,BombAdd)


Über folgende Methode wird BombList als Zeiger der Hauptprogramm übergeben.
Das funktioniert auch, hab ich im Hauptprogramm mit cout<<BombList getestet.
Die Adressen stimmen überein.

C++:
BombLaunchList* Project::getBombs()
{
    return BombList;
}


Doch

C++:
BombIter=BombList->begin();
cout<<BombIter->getBombId();


liefert nichts.
getBombId() ist eine Zugriffsmethode des Objektes in der Liste.
Ansonsten ist mein Programm wie oben, die Liste wurde dynamisch erzeugt.
Es stand aber in meinem Buch, dass ich den Iterator wie einen Zeiger verwenden kann.
Also müsste doch der Zugriff korrekt sein.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.07.2006, 19:54 Uhr
mase



Naja, der Fehler, dass nix ausgegeben wird lag bereits in einer anderen Klasse. Das
hab ich nun lösen können.

C++:
        BombLaunch* BombAdd=new BombLaunch;
        BombAdd->setBombId(_BombId);
        BombAdd->setBombLaunchTime(_BombLaunchTime);
        BombAdd->setBombLaunchGroup(_BombLaunchGroup);
        BombAdd->setBombLaunchSlot(_BombLaunchSlot);

        BombIter=BombList->begin();
        for(unsigned int PosCount=1;PosCount!=_Pos;PosCount++)
        {
            BombIter++;
        }
        BombList->insert(BombIter,*BombAdd);
        delete BombAdd;
        return OK;


Dieses Einfügen in die Liste ergibt einen Segmentation Fault.
Dies ist ein Teil meiner add-Funktion. Die Variablen mit dem Unterstrich werden vom
Hauptprogramm übergeben. _Pos ist die Position des Listeneintrags.
Mit der for-Schleife will ich den Iterator auf die gewünschte Position setzen.
BombAdd ist ein temporäres Objekt, dass die übergebenen Daten aufnimmt.
BombIter ist der Iterator, den ich schon oben angesprochen hab.
Doch warum funktioniert das so nicht?
--
May the force be with us!

Dieser Post wurde am 20.07.2006 um 19:56 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.07.2006, 17:49 Uhr
mase



Ich hab's lösen können.
Ich hab das Verschieben der Iterators in eine eigene Funktion gepackt,
weil ich es öfter benötige.

C++:
    void Project::MoveBombIter(unsigned int _Pos)
    {
        BombIter=BombList->begin();
        for(unsigned int PosCount=1;PosCount!=_Pos;PosCount++)
        {
            BombIter++;
        }
        return;
    }


Dann kommt die Funktion noch ein zweites Mal vor, nur mit MusicIter und MusicList
als Parameter. Das hätte ich auch gern mit Templates gelöst, aber das hab ich nicht
hingekriegt.
Jedenfalls funktioniert es so mal.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: