Derivec Class + virtual function problem



  • Hallo, ich habe eine Klasse FrameworkElement:

    class FrameworkElement
    {
    	public:
    		FrameworkElement();
    
                    virtual void OnRender();
    };
    

    und zwei abgeleitete Klassen Panel und TextBlock:

    class Panel : public FrameworkElement
    {
    	public:
    		Panel();
    
    		std::list<FrameworkElement> m_Children;
    		virtual void OnRender();
    };
    
    void Panel::AddChild(FrameworkElement child)
    {
    	m_Children.push_back(child);
    }
    
    void Panel::OnRender()
    {
         for(std::list<FrameworkElement>::iterator it = m_Children.begin(); it != m_Children.end(); ++it)
             it->OnRender();
    }
    
    class TextBlock : public FrameworkElement
    {
    	public:
    		TextBlock();
    
    		void OnRender();
    };
    

    erzeuge ich jetzt im Code einen TextBlock und "adde" diesen im Panel:

    m_pMainPanel = new Panel();
    	m_pTextBlock = new TextBlock();
    	m_pMainPanel->AddChild(*m_pTextBlock);
    

    Dann wird jedoch die OnRender()-Funktion des FrameworkElements aufgerufen und nicht die des TextBlocks, obwohl dies doch gar nicht sein dürfte. Woran kann das liegen? Ich vermute es liegt an der list<FrameworkElement>.



  • Versuchs mal mit einer list aus Zeigern anstatt die Objekte zu kopieren.



  • Ok, habe ich soweit geändert. Die for Schleife schaut jetzt so aus:

    for(std::list<FrameworkElement*>::iterator it = m_Children.begin(); it != m_Children.end(); ++it)
    it->OnRender();
    

    Allerdings kommt an der Stelle it->OnRender() jetzt folgende Fehlermeldung:

    'OnRender' : is not a member of 'std::_List_iterator<_Mylist>
    invalid return type 'FrameworkElement **' for overloaded 'operator ->'

    Auch
    &it->OnRender();
    *it->OnRender();
    *it.OnRender();
    &it.OnRender();

    hat nicht funktioniert.



  • Priorität von -> über * beachten und Klammern verwenden. Erst den Iterator dereferenzieren, dann Methode aufrufen.



  • Meinst du (*it)->OnRender(); ? Leider stürzt das Programm nun andieser Stelle ab.



  • Geht doch, ich hatte noch was anderes getestet und nicht wieder rückgängig gemacht. Danke dir für die Hilfe.


Anmelden zum Antworten