Wie direkt auf Objekte in einem Vector zugreifen?



  • Hallo!

    Ich bin dabei ein kleines OOP-Programm (Mailchecker) in C++ zu schreiben. (Delphi Programmierer, aber C++ - Anfänger.

    Dafür habe ich fürs erste eine Klasse clMail erstellt, welche als Vorlage für Mailobjekte dient (bzw. die Attribute der Objekte mit den Informationen einer einzelnen Mail versorgt werden wie z.B. Header, Absender, Mailtext etc).

    Desweiteren existiert eine Klasse clMailserver, dessen Objekte Serverdaten enthalten sollen. Zusätzlich aber auch einen Vector, der als Container für die Mailobjekte des Servers dient.

    vector <clMail> Mails;

    Soweit alles ok...

    In meinem Basisprogramm wird nun ein Objekt der Klasse clMailserver erstellt und mit Werten versehen.
    Dann wird der Mailserver angefragt und gibt die Anzahl der für meinen Account auf dem Server bereitstehenden Mails zurück.
    Diese Mails werden einzelnd abgefragt und für jede Mail das Vector-Array um ein neu kreiertes Mailobjekt erweitert. (Kein Pointer, sondern das Object steht direkt im Vector).

    Das Erzeugen und Testbefüllen des Objektes sieht so aus:

    43: for(i=1;i<=mailserver1.iAnzahlMails;i++)
    44: {
    45: mailserver1.Mails.push_back(new clMail);
    46: mailserver1.Mails*.strHeader = popgethead(mysession,i);
    47: }

    Wobei Mails offensichtlich der Vector ist und clMail meine oben beschriebene Klasse.

    Führe ich das so aus gibt es folgende Fehlermeldungen:

    [i] oopmail.cpp: In function int main()': oopmail.cpp:45: error: no matching function for call tostd::vector<clMail, std::allocator<clMail> >::push_back(clMail*)'
    /usr/include/c++/3.3.2/bits/stl_vector.h:596: error: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = clMail, _Alloc = std::allocator<clMail>]
    oopmail.cpp:49: warning: comparison between signed and unsigned integer expressions*

    Meine Klassen besitzen noch keinen eigenen Konstruktor.

    Kann da jemand was zu sagen?

    Und dann noch eine Frage:

    Ist der danach geplante Zugriff auf die Werte der Attribute eines Mail-Objektes nach folgender Variante

    mailserver1.Mails[i].strHeader

    zulässig?

    Wäre nett, wenn mir jemand auf die Sprünge helfen könnte.

    Dankschön.

    Cu,
    Gosar



  • das müsste
    push_back( new clMail**()** ) sein.

    ausserdem ist der vector falsch definiert
    std::vector<clMail, std::allocator<clMail> >::push_back(clMail*)'
    ist falsch, das müsste
    std::vector<clMail*****, std::allocator<clMail*****> >::push_back(clMail*)'



  • Erstmal vielen Dank.
    Nun also doch keine Objekte direkt im vector, sondern Zeiger auf die Objekte. (*)

    Wie kann ich nun auf die Objekte zugreifen ?

    Die Zeile 46, die im vorherigem Posting leider etwas falsch dargestellt wurde sieht so aus:

    46: mailserver1.Mails[ i ].strHeader = popgethead(mysession,i);

    Dieses führt nun dazu, dass das Objekt nicht direkt angesprochen werden kann:

    "oopmail.cpp: In function int main()': oopmail.cpp:46: error: request for member \strHeader' in `((&mailserver1) + 24)->std::vector<_Tp, _Alloc>::operator[] [with _Tp = clMail*, _Alloc = std::allocator<clMail*>](i)', which is of non-class type `clMail*'
    oopmail.cpp:49: warning: comparison between signed and unsigned integer expressions
    "

    Wie kann ich nun über den Zeiger in der Art wie in Zeile 46 auf mein Object und vor allem auf das Attribut .strHeader zugreifen ?

    Gruß,
    Gosar



  • da in dem vektor nur zeiger auf clMail gespeichert sind, muss du das dereferenzieren ( hab ich das richtig geschrieben? ).
    also anstatt:
    mailserver1.Mails[ i ].strHeader = popgethead(mysession,i);
    dass:
    mailserver1.Mails[ i ]->strHeader = popgethead(mysession,i);



  • Das war´s ....

    Vielen Dank!

    Gosar


Anmelden zum Antworten