Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » STL LIST mit eigener klasse drin

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
01.08.2005, 23:36 Uhr
~tomster
Gast


Hey leude ,
ich hab folgendes problem:

ich will : Eine klasse MUmodul erstellen, die eine STL-Liste enthält, die als elemente

objekte der klasse MUmodulUSER enthält. Aber ich muss die möglichkeit haben die
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.08.2005, 23:50 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ein wenig unvollständig der Post... was ist die Frage und was das Problem?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.08.2005, 23:52 Uhr
~Tomster10k
Gast


Hey leude ,
ich hab folgendes problem:

ich will : Eine klasse MUmodul erstellen, die eine STL-Liste enthält, die als elemente

objekte der klasse MUmodulUSER enthält. Aber ich muss die möglichkeit haben die

Objekte der Klasse MUmodulUSER dynamisch zu kreieren.

So, hier mein Code:

C++:
//----------------------------------------------------------------------------
MUmodul.h:

#pragma once
#include "ini2.h"
#include "MUmodulUSER.h"
#include <list>        // list class library
using namespace std;



class MUmodul
{
public:
    MUmodul(void);
    ~MUmodul(void);
    void AddUser(CString Login,CString Pw,CString Path,int AccLevel);
    MUmodulUSER* GetUserByLogin(CString Login); //Gibt ein Objekt des gefundenen Users zurück

private:
    
    list<MUmodulUSER*> *userlist;

};

//----------------------------------------------------------------------------

MUmodul.cpp:

#include "StdAfx.h"
#include "MUmodul.h"
#include <list>
#include <stdlib.h>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


MUmodul::MUmodul(void)
{
    list<MUmodulUSER*> *userlist = new list<MUmodulUSER*>;

    
    CIni MUmodulINI(_T("MUmodul.ini"),_T("User1"));
    
    userlist->push_front( new MUmodulUSER( MUmodulINI.GetString(_T("login")),MUmodulINI.GetString(_T("pw")),MUmodulINI.GetString(_T("filepath")),MUmodulINI.GetInt(_T("accesslevel"))) );
}

MUmodul::~MUmodul(void)
{
}

void MUmodul::AddUser(CString Login,CString Pw,CString Path,int AccLevel)
{

}

MUmodulUSER* MUmodul::GetUserByLogin(CString Login)
{
    list<MUmodulUSER*>::iterator *iter;
    
    
    //    iter->
    
    return NULL;

}

//----------------------------------------------------------------------------


DAS PROBLEM IST: ICH KANN MIT DEM ITERATOR "ITER" nicht auf mein Objekt in der liste zugreifen. bei der code vervollständigung kann ich nur auf :

                             iter->difference_type
           iter->iterator
           iter->iterator_category
           iter->operator *
           iter->operator ++
           iter->operator --
           iter->operator ->
           iter->pointer
           iter->value_type
           iter->reference

zugreifen. und ich will  ja an mein objekt ran . HILFE  :shock:


//----------------------------------------------------------------------------

MUmodulUSER.h:

#pragma once

class MUmodulUSER
{
public:
    MUmodulUSER(CString Login,CString Pw,CString Path,int AccLevel);
    MUmodulUSER(void);
    ~MUmodulUSER(void);
    CString login;
    CString pw;
    CString path;
    int accLevel;

};

//----------------------------------------------------------------------------

MUmodulUSER.cpp  

#include "StdAfx.h"
#include "mumoduluser.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



MUmodulUSER::MUmodulUSER(CString Login,CString Pw,CString Path,int AccLevel)
{
login=Login;
pw=Pw;
path=Path;
accLevel=AccLevel;

}

MUmodulUSER::~MUmodulUSER(void)
{
}

MUmodulUSER::MUmodulUSER(void)
{

}

//--------------------------------------------------------------------------------


Dieser Post wurde am 02.08.2005 um 00:22 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.08.2005, 09:54 Uhr
Th



Du hast einen Pointer auf einen Iterator erzeugt (list<MUmodulUSER*>::iterator *iter;). richtig lautet es:

C++:
list<MUmodulUSER*>::iterator iter;

for(iter = userlist.begin(); iter != userlist.end(); ++iter)
{
    MUmodulUSER &user = *iter; // Zugriff auf ganze Struktur
    CString sLogin = iter->login; // Zugriff auf einzelnes Element;
}



Außerdem solltest du "userlist" auch nicht als Pointer definieren, also nur

C++:
list<MUmodulUSER*> userlist;



Und im Konstruktor nicht eine lokale Liste selben Namens anlegen...

Du solltest dich nochmal ein bißchen über Pointer und iteratoren informieren...

Dieser Post wurde am 02.08.2005 um 09:55 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.08.2005, 09:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Also zunächst mal vorweg: ich habe Deinen Code nicht genau studiert,habe aber den Eindruck gewonnen, daß Du keine List von MUmodulUSER Objekten sondern von MUmodulUSER Zeigern hast. Das ist ein ganz imenser Unterschied. Der, welcher dir vermutlich erst als letztes auffallen wird ist der, daß Du die Liste bei Zeigern selbst aufräumen mußt, weil die Liste hier für dich kein Delete machen wird.

Ich zeige die Problematik mal an einer Klasse Punkt:

C++:
struct punkt {
    int x;
    int y;
    punkt(intx, int y) :x(x) :y(y) { }
};


Ein Polygon sei nun eine liste von punkten. Du nimmst ja Pointer of Punkte:

C++:
std::list<punkt*> polygon;

polygon.push_front(new punkt(1,1));


Wie kann man nun auf die x Komponente (bzw. eben methode) zugreifen? - Das geht so:

C++:
std::list<punkt*>::iterator iter = polygon.begin();
...
int x_komponente = (*iter)->x;


Sieht krumm aus, gell? - Das liegt daran, daß ein Iterator genauso benutzbar ist, wie ein Zeiger auf die enthaltenen Elemente. Ein enthaltenes Element ist ein punkt*, also kann man den Iterator wie ein punkt** verwenden.
Auch an anderer Stelle wirst du so probleme bekommen, weil der Destruktor von punkt* nix macht. Dh du bekommst ein Speicherloch, weil die Liste nicht delete aufruft.

Letztlich kannst Du das Problem dadurch lösen, indem du die Liste mit Objekten und nicht mit Zeigern machst:

C++:
std::list<punkt> polygon; // Kein *!

polygon.push_front(punkt(1,1)); // Kein new!
...
std::list<punkt>::iterator iter = polygon.begin();
...
int x_komponente = iter->x;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.08.2005, 10:11 Uhr
~Tomster10k
Gast


erstma danke für deine antwort:

auch deine speicherloch-beschreibung is sinnvoll.
nur ich hab ein anderes problem.:

ich habs es jetzt nach deinem gerüst abgeändert:

class MUmodul
{
public:

MUmodulUSER* GetUserByLogin(CString Login); //Gibt ein Objekt des gefundenen Users zurück

private:

list<MUmodulUSER> userlist;

};



CPP:


MUmodul::MUmodul(void)
{
userlist.push_front( MUmodulUSER( _T("login"),_T("pw"),_T("filepath"),3 );

}

MUmodulUSER* MUmodul::GetUserByLogin(CString Login)
{
//userlist.iterator *iter;
list<class MUmodulUSER>::iterator *iter;

/////// ------ > Problem is hier <--------- ////////////
/// per referenziertem iter kann ich net auf die elemente meiner KLASSE inder liste zugreifen.
// iter-> // <-- da gbits nur "operator ->" oder "value" oder son kram , hat aber nix mit meiner klasse zu tun

return NULL;

}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.08.2005, 10:12 Uhr
~Tomster10k
Gast


dein vorschlag vorher mit " (*iter)-> " hatte auch net funktioniert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.08.2005, 10:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Was machst Du denn die ganze Zeit mit diesen Zeigern?

C++:
MUmodulUSER* MUmodul::GetUserByLogin(CString Login)
{
list<class MUmodulUSER>::iterator *iter;
...


schaut nicht richtig aus. Meiner Meinung nach einfach:

C++:
MUmodulUSER* MUmodul::GetUserByLogin(CString Login)
{
list<class MUmodulUSER>::iterator iter; // * weg!
...


Denn sonst kommst Du wieder in Probleme... Nimm mal den Tip von @Th auf und les zumindestens ansatzweise, was zu Iteratoren und Zeigern so im Netz zu finden ist, denn sonst ist bei Dir bestimmt Frust vorprgrammiert.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
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: