Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Objekt soll Zeiger auf Objekt zurückliefern

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 < [ 2 ]
000
08.07.2006, 20:07 Uhr
mase



Hallo!
Ich habe ein Objekt, dass ein Objekt einer verketteten Liste dynamisch anlegt.
Dieses Objekt soll nun der aufrufenden Funktion im Hauptprogramm einen Zeiger
auf die Liste zurückliefern, dass das Hauptprogramm damit arbeiten kann.
Jetzt hab ich gleich 2 Probleme:
Die Liste wollte ich im Konstruktor des Objekts dynamisch anlegen.

C++:
class Session
{
    public:
    Session(string _FileName):FileName(_FileName)
    {
        List* MusicList=new List;
    }
    ~Session() {}
...


Das gibt schon: Warnung: Variable »MusicList« wird nicht verwendet
Im restlichen Objekt ist MusicList dann nicht bekannt.

Dann will ich dem Hauptprogramm einen Zeiger auf MusicList returnen.

C++:
List Session::getMusic()
{
List* MusicList=new List; //Liste wird hier erstellt, da ich es im Konstruktor nicht hinbekam
//Liste wird gefüllt
return &List;
}



Ich bekomm den Fehler: Umwandlung von »int« in nicht-skalaren Typen »List« angefordert

Ich bin absoluter C++-Neuling. Kann mir jemand einen Tip geben, wie ich das lösen kann?
--
May the force be with us!

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


ok,
Punkt 1: Du solltest dir mal den Gültigkeitsbereich von Variablen anschauen: deine MusicList ist immer nur in der jeweiligen Funktion gültig da sie dort definiert worden ist.
Punkt 2: Warum dynamisch mit new anlegen? Ist doch unnötig
Punkt 3: MusicList ist in dem Fall schon ein Pointer und den solltest du zurückgeben, d.h &List ist falsch. List ist dein Typ, nicht die Variable.
Punkt 4: Du solltest auch "List *Session::getMusic" schreiben, sonst kriegst du keinen Pointer sondern will eine Kopie.

Also im großen und ganzen so:


C++:
class Session
{
public:
    Session(string _FileName) : FileName(_FileName) { }
    ~Session() {}
    List *Session::getMusic()
    {
       return &MusicList; // hier ist das & erforderlich, da MusicList kein Pointer.
    }

//...

private:
    List MusicList; // Variable als private Membervariable anlegen.
};


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.07.2006, 20:45 Uhr
mase



Danke!
Jetzt hab ich aber noch ein weiteres Problem:
Ich habe in meiner Klasse eine verkettete Liste mit

C++:
List* tempMusicList=new List;


angelegt. In derselben Klasse soll es eine Funktion WriteFile geben, die mir die
Inhalte dieser Liste in ein File schreibt.
Das Schreiben hab ich ja schon hingekriegt.
Jedoch muss ich der Funktion die Liste übergeben. Das geht ja anscheinend auch
nur über Zeiger.
Die Schreibfunktion sieht in etwa so aus:

C++:
ListElement* tmp;
for(tmp=_MusicList->front();tmp!=0;tmp=tmp->Next)
{
   SessionFile<<tmp->Item1<<" "<<tmp->Item2<<" "<<tmp->Item3<<" "<<tmp->Item4<<"\n";
}


--
May the force be with us!

Dieser Post wurde am 09.07.2006 um 20:46 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.07.2006, 22:55 Uhr
mase



Vielleicht sollte ich noch meine Listenklasse posten.


C++:
#include <string>

using namespace std;



struct ListElement
{
    ListElement* Next;
    unsigned int Pos;
    string Item1;
    string Item2;
    string Item3;
    string Item4;
    ListElement():Next(0) {}
    ListElement(const unsigned int& _Pos,const string& _Item1,const string& _Item2,const string& _Item3,const string& _Item4):Next(0),Pos(_Pos),Item1(_Item1),Item2(_Item2),Item3(_Item3),Item4(_Item4) {}
};



class List
{
    private:
    ListElement* First;
    ListElement* Last;
    int Number;

    public:
    List():First(0), Last(0), Number(0) {}
    virtual ~List();
    bool empty() const {return (Number == 0);}
    int size() const {return Number;}
    void push_back(const unsigned int& Pos,const string& Item1,const string& Item2,const string& Item3,const string& Item4);
    void pop_front();
    ListElement* front() {return First;}
};


--
May the force be with us!

Dieser Post wurde am 09.07.2006 um 22:56 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.07.2006, 21:12 Uhr
mase



Mein voriges Problem besteht leider immernoch:
Meine Klasse Project erzeugt eine verkettete Liste aus der Klasse ProjectList.


C++:
using namespace std;

enum Gap {NONE,FADE,CROSSFADE};
enum Action {ADD,DEL,MOVE,LOAD_PROJECT,SAVE_PROJECT,OVERWRITE_PROJECT,DEL_PROJECT,CLOSE_PROJECT};
enum Status {OK,LOAD_ERROR,SAVE_ERROR,FILE_EXISTS};



class Project
{
    public:
    Project(string _FileName):FileName(_FileName)
    {
        ProjectList* MusicList=new ProjectList;
    }
    ~Project()
    {
        delete MusicList;
    }
    //Give reference to Error to get an errorcode of the action, give reference to MusicQuant with value 0 to get number of musicfiles in project
    ProjectList *editMusic(Action _Action,Status& Error,unsigned int& MusicQuant,string _MusicFile,string _MusicInpoint,string _MusicOutpoint,Gap _MusicGap,unsigned int _Pos,unsigned int _NewPos);

    private:
    Project() {}
    string FileName;
    unsigned int Pos;
    string MusicFile;
    string MusicInpoint;
    string MusicOutpoint;
    Gap MusicGap;
    string Data1,Data2,Data3,Data4;
    ProjectList* MusicList;
    ProjectList* tempMusicList;
};


So bekomm ich aber die Warnung Variable »MusicList« wird nicht verwendet.
Das ist wahrscheinlich die Ursache für den restlichen Fehlerschwall.
MusicList wird doch im allgemeinen Konstruktor erzeugt. Dann müsste es doch
im gesamten Objekt bekannt sein. Den Standardkonstruktor hab ich deshalb
privat deklariert, weil das Objekt nur mit übergebenen Parametern erzeugt
werden darf.
In der Klasse Project will ich einen Zeiger auf MusicList returnen. Ich hab dazu
return MusicList; geschrieben.
Das Objekt leg ich deshalb dynamisch an, weil es doch eine grössere Datenmenge
aufnehmen kann. Die verkettete Liste, die es erzeugt, kann gewaltig werden.
Irgendwie hab ich in meinen Büchern und auch im Netz nichts hilfreiches über
Zeiger auf Objekte und deren Übergabe gefunden. Meistens werden die Zeiger
vor den Klassen besprochen, und dann nicht mehr weiter darauf eingegangen.
Vielleicht stell ich mich aber auch blöd an. Aber wie gesagt: Ich bin blutiger Anfänger.
Kann mir da jemand auf die Sprünge helfen?
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.07.2006, 08:46 Uhr
ao

(Operator)



Zitat von mase:


C++:
class Project
{
    public:
    Project(string _FileName):FileName(_FileName)
    {
        MusicList=new ProjectList;
    }
    ~Project()
    {
        delete MusicList;
    }
    // ...
    ProjectList* MusicList;
};


MusicList wird doch im allgemeinen Konstruktor erzeugt.

Nein, du deklarierst im Konstruktor ein lokales Objekt Musiclist, das das Klassenmember verdeckt. Das lokale Objekt wird initialisiert und anschließend vergessen, das Klassenmember bleibt im Rohzustand.

So wie oben müsste es besser gehen.


Zitat:
Aber wie gesagt: Ich bin blutiger Anfänger.

In dem Fall ist eine verkettete Liste wohl noch eine Nummer zu groß für dich. Fang mit was einfacherem an, nimm dir zum Beispiel oben unter "Ebooks" das Buch "C++ in 21 Tagen" vor.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.07.2006, 14:47 Uhr
mase



Danke!
Ich werd's mal so probieren.
Das genannte Buch hab ich in gedruckter Form.
Die Liste selber funktioniert ja wunderbar. Ich hab mein Programm nur
etwas umstrukturiert.
--
May the force be with us!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.07.2006, 16:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von mase:

Das genannte Buch hab ich in gedruckter Form.


Haben bringt nicht viel wenn mans nicht durcharbeitet/durchliest
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.07.2006, 19:23 Uhr
mase



Ich lerne eigentlich mehr aus dem Buch "C++ mit Linux" von Thomas Wieland.
Da war nix derartiges drin.
Im anderen fand ich eine ähnliche Situation, mit der ich mein Problem einigermassen
lösen konnte.
So hab ich's gemacht:


C++:
class Project
{
    public:
    Project(string _FileName):FileName(_FileName)
    {
        MusicList=new ProjectList;
     }
    ~Project()
    {
        delete MusicList;
     }
    ProjectList* getMusic();


Mein Konstruktor, Destruktor und die Zugriffsmethode.


C++:
    private:
    Project() {}
    ProjectList* MusicList;


Der Standardkonstruktor nach wie vor privat. Member so deklariert.


C++:
ProjectList* Project::getMusic()
{
    return MusicList;
}


Die Zugriffsmethode dann in der Klasse.


C++:
ProjectList* MusicList=Proj.getMusic();


So übernimmt mein Hauptprogramm den Zeiger.

Auf Anhieb funktioniert es mal so. Kann man da noch was verbessern, oder ist das so
in Ordnung?
--
May the force be with us!

Dieser Post wurde am 11.07.2006 um 19:26 Uhr von mase editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.07.2006, 19:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich würde nicht umbedingt die interne Liste "rausreichen" zumindest nicht schreibbar.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: