2017-10-26 1 views
0

Ich habe 2 Klassen in ssservice.h:C++ Liste Funktion Rückgabeliste

class ssverbindungsdaten 
    { 
    public: 
     ssverbindungsdaten(); 
     ~ssverbindungsdaten(); 

     int id; 
     string test; 

    }; 

    class softswitch{ 
    public: 
     softswitch(); 
     ~softswitch(); 
     list<ssverbindungsdaten> holeAlleRohdaten(); 

    }; 

Mein ssservice.ccp:

list<ssverbindungsdaten> softswitch::holeAlleRohdaten(){ 


    //ssverbindungsdaten * ssv = new ssverbindungsdaten; 

    list<ssverbindungsdaten> *listTmp = new list<ssverbindungsdaten>; 

    return *listTmp; 

} 

Und mein main.cpp:

int main(int argc, char *argv[]) 
{ 
    //TODO: Mulithreading 
    std::cout << "Starte ..."; 

    softswitch *ss = new softswitch; 

    list<ssverbindungsdaten> *liSSVVerbinngsdaten = new list<ssverbindungsdaten>(); 

    liSSVVerbinngsdaten = ss->holeAlleRohdaten(); 


    return 0; 
} 

Aber In main.cpp ist ein Fehler aufgetreten:

cannot convert ‘std::__cxx11::list<ssverbindungsdaten>’ 
    to ‘std::__cxx11::list<ssverbindungsdaten>*’ 
    in assignment 
    liSSVVerbinngsdaten = ss->holeAlleRohdaten(); 

Es sollte

sein Die Liste "holeAlleRohdaten" sollte ein lsit sein, das alle Klassen "ssverbindungsdaten" enthält.

Das kann ich später durch die "liSSVVerbinungsdaten" in main.cpp durchlaufen, und bekomme alle Klassen "ssverbindungsdaten" mit den Werten (int id, string test).

Warum kann ich nicht einfach die Liste "liSSVVerbindungsdaten" auf "ss-> holeAlleRohdaten" setzen?

+1

Sie verwenden Zeiger zu viel. Und undicht als Ergebnis. Es ist nicht das Problem, vor dem Sie stehen. Aber es ist ein wichtiger und eng verbunden. – StoryTeller

+0

Kommen Sie von einem Java oder C# Hintergrund? In C++ müssen Sie zum Erstellen von Objekten nicht 'new' verwenden. Z.B. 'list listTmp;' ist genug. –

+0

@Someprogrammerdude Ich dachte in cpp mit dem "neuen" die Objekte werden im RAM gespeichert? Denn die Objektliste enthält später ca. 200 000 Entrys mit ca. 50 Attributen pro Klasse. – Patrick

Antwort

1
list<ssverbindungsdaten> *listTmp = new list<ssverbindungsdaten>; 

Das „neue“ Schlüsselwort in C++ weist tatsächlich einen neuen Zeiger, so dass Sie manuell einen Zeiger auf eine Liste von ssverbindungsdaten Objekten zugeordnet werden. Wenn Sie nur eine Standard-Instanz der Klasse oder eine Liste erstellen möchten verwenden

list<ssverbindungen> listTmp;

Edit: Auch in Deutsch stoppen Codierung und Groß Ihre Klassennamen

+0

Warum Großbuchstaben meine Klassennamen? – Patrick

+0

Ich habe sie Kamel jetzt – Patrick

+0

@Patrick, weil Klassen immer mit einem Großbuchstaben beginnen und Camel Fall fortsetzen. Es ist international als Best Practice anerkannt. Egal welche Sprache. – Flowkap

1

Wenn Sie alle überspringen new und Zeiger, der Code wird eine Menge einfacher:

int main(int argc, char *argv[]) 
{ 
    //TODO: Mulithreading 
    std::cout << "Starte ..."; 

    softswitch ss; 

    list<ssverbindungsdaten> liSSVVerbinngsdaten = ss.holeAlleRohdaten(); 

    return 0; 
} 

C++ nicht wie Java oder C# ist. Die Klasse list behandelt intern alle Heapzuweisungen. Du musst das nicht tun.

1

Sie sollten das tun, was die anderen sagen über Zeiger, intelligente Zeiger, Namensgebung, ...

Aber Ihr Fehler ist

liSSVVerbinngsdaten = ss->holeAlleRohdaten(); 

liSSVVerbinngsdaten ein Zeiger auf eine Liste und ss->holeAlleRohdaten() eine Liste zurückgibt. Sie können Ihr Programm beheben, indem Sie einen Zeiger

ssservice.h Rückkehr:

class ssverbindungsdaten 
{ 
public: 
    ssverbindungsdaten(); 
    ~ssverbindungsdaten(); 

    int id; 
    string test; 

}; 

class softswitch{ 
public: 
    softswitch(); 
    ~softswitch(); 
    list<ssverbindungsdaten>* holeAlleRohdaten(); 

}; 

ssservice.ccp:

list<ssverbindungsdaten>* softswitch::holeAlleRohdaten(){ 

    //ssverbindungsdaten * ssv = new ssverbindungsdaten; 

    list<ssverbindungsdaten> *listTmp = new list<ssverbindungsdaten>; 

    return listTmp; 

} 

main.cpp:

int main(int argc, char *argv[]) 
{ 
    //TODO: Mulithreading 
    std::cout << "Starte ..."; 

    softswitch *ss = new softswitch; 

    list<ssverbindungsdaten> *liSSVVerbinngsdaten = new list<ssverbindungsdaten>(); 

    delete liSSVVerbinngsdaten; 
    liSSVVerbinngsdaten = ss->holeAlleRohdaten(); 

    delete softswitch; 
    delete liSSVVerbinngsdaten; 
    return 0; 
} 

Diese Antwort ist nur um den Fehler zu verstehen. Wie die anderen sagten, sollten Sie rohe Zeiger vermeiden und intelligente Zeiger verwenden. Wenn Sie mit rohen Zeigern arbeiten, sollten Sie daran denken, dass zu jedem new ein delete gehört.

Verwandte Themen