array von Pointern auf Klasse



  • Hi,

    ich versuche über <vector> ein dynamisches array von Pointer zu erzeugen, die auf eine Klasse zeigen. Egal was ich bis jetzt versucht habe, immer muss eine Konvertierung vorgenommen werden, die ich nicht nachvollziehen kann.

    std::vector<std::string>vectorliste;
    
    vectorliste.push_back(ptest->Delete());
    
    error C2664: 'push_back' : Konvertierung des Parameters 1 von 'void' in 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &' nicht moeglich
    Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden
    

    Ich hoffe mir kann jemand helfen. Ich finde den Fehler einfach nicht...

    Gruß eddy



  • Ähm...

    1. Du hast mit
    std::vector< std::string > vectorliste;
    

    kein

    edmundy schrieb:

    [...] dynamisches Array von Pointer [...], die auf eine Klasse zeigen [...]

    , sondern einen std::vector, welcher Objekte (Instanzen) der Klasse std::string enthalten kann.

    1. was ist denn ptest in

    edmundy schrieb:

    vectorliste.push_back( ptest->Delete( ) );
    

    ? Bzw. was gibt ptest::Delete( ) zurück? Falls es nicht zufällig einen std::string zurückgibt ist der Aufruf quatsch.

    1. Ah ja... Dem Fehler

    edmundy schrieb:

    error C2664: 'push_back' :
    Konvertierung des Parameters 1 von 'void' in 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &' nicht moeglich
    

    nach gibt ptest::Delete( ) nix (void) zurück und damit ist der Aufruf wirklich unsinn ➡ Der Compiler meckert zurecht.

    Magst du vielleicht verraten, was du damit vorhast?

    Ein (diesmal wirklich)

    edmundy schrieb:

    [...] dynamisches ["]Array["] von Pointer [...], die auf eine Klasse [-> Instanzen der Klasse std::string] zeigen [...]

    wäre soetwas:

    #include <string>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int main( )
    {
        vector< string* > array;
    
        // füllen:
    
        array.push_back( new string( "Hello" ) );
        array.push_back( new string( ", " ) );
        array.push_back( new string( "World!") );
        array.push_back( new string( "\n" ) );
    
        // ausgeben:
    
        for( vector< string* >::iterator i = array.begin( ); i != array.end( ); ++i )
            cout << **i;
    
        // aufräumen:
    
        for( vector< string* >::iterator i = array.begin( ); i != array.end( ); ++i )
            delete *i;
    }
    

    Greetz, Swordfish



  • Danke das du dir soviel Mühe gemacht hast! Hat mir viel Klarheit gebracht, aber leider konnte ich es nicht auf mein Problem umsetzen.

    nach gibt ptest::Delete( ) nix (void) zurück und damit ist der Aufruf wirklich unsinn ➡ Der Compiler meckert zurecht.

    Magst du vielleicht verraten, was du damit vorhast?

    Ich versuch es mal und hoffe, dass ich mich richtig ausdrücken kann.
    In diesem Array will ich Pointer auf die Klasse CFunktionen speichern in der beispielsweise die Funktion Delete() ist. Über dieses Array will ich dann je Zeile des Arrays eine Funktion aufrufen. Ist sowas möglich?

    CFunktionen* ptest;
    ptest = new CFunktionen();
    array.clear();
    
    while(!pAuswahl->IsEOF())
    		{
    		array.push_back(ptest);
    		pAuswahl->MoveNext();
    
    		}
    

    Gruß Eddy



  • Hallo

    das ist schon möglich, wenn du einen Vector mit dem Typ std::vector<CFunktionen>* hast.

    Allerdings wird in deinem Beispiel jeweils der gleiche Pointer auf die gleiche Instanz in den vector aufgenommen, und das dürfte wohl sinnlos sein.

    Außerdem must du dann auch die angelgten Instanzen wieder selber löschen.

    bis bald
    akari



  • edmundy schrieb:

    In diesem Array will ich Pointer auf die Klasse CFunktionen speichern in der beispielsweise die Funktion Delete() ist. Über dieses Array will ich dann je Zeile des Arrays eine Funktion aufrufen. Ist sowas möglich?

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    class CFunktionen {
    
        private:
    
            size_t _index;
    
        public:
            CFunktionen( ) { }
            CFunktionen( size_t index ) : _index( index ) { };
            ~CFunktionen( ) { };
    
           void Delete( )
           {
               cout << "CFunktionen::Delete( )" << endl;
               cout << "CFunktionen::index = " << _index << endl << endl;
           }
    };
    
    int main( )
    {
        vector< CFunktionen* > Vector;
    
        Vector.push_back( new CFunktionen( 1 ) );
        Vector.push_back( new CFunktionen( 2 ) );
        Vector.push_back( new CFunktionen( 3 ) );
        Vector.push_back( new CFunktionen( 4 ) );
        Vector.push_back( new CFunktionen( 5 ) );
        Vector.push_back( new CFunktionen( 6 ) );
        Vector.push_back( new CFunktionen( 7 ) );
    
        for( vector< CFunktionen* >::iterator i = Vector.begin( ); i != Vector.end( ); ++i )
            (**i).Delete( );
    
        // aufräumen:
    
        for( vector< CFunktionen* >::iterator i = Vector.begin( ); i != Vector.end( ); ++i )
            delete *i;
    }
    

    Greetz, Swordfish



  • In diesem Array will ich Pointer auf die Klasse CFunktionen speichern

    Das geht nicht! In C++ sind Klassen keine first-class-citizens --
    also keine Objekte -- wie z.B. in Smalltalk.



  • Er meint dynamisch angelegte Instanzen von CFunktionen, kleinlicher Meckerer 😉

    Greetz, Swordfish



  • Vielen Dank an Euch. Allen voran Swordfish, denn genau das brauchte ich.
    Ich werde versuchen, meine Probleme fachlicher zu formulieren. Für den Anfang ist es aber recht schwer 😉

    Gruß und schönen Abend
    Edmundy


Anmelden zum Antworten