stack aus abgeleiteten klassen



  • Hi

    ich wollte ein stack aus abgeleiteten klassen machen,
    dazu gibt es eine basisklasse, von der man klassen ableitet und diese im stack zusammenfasst,

    so:
    stack.items[0].Render()
    wobei items[0] eine abgeleitete klasse von item ist und nich item selbst..

    ich hab eine Basisklasse

    class item {
    public:
        virtual void Render() = 0;
    };
    

    dann der stack:

    #define MAXSTACK 2
    class Cmenustack {
    public:
        Cmenustack();
        int count;
        item *items[MAXSTACK];
        void Push(item *menu);
        void Pop();
        item *GetTopItem();
    };
    
    Cmenustack::Cmenustack() { 
        this->count = 0; 
        for(int i=0;i<MAXSTACK;i++) 
            this->items[i] = NULL;
    }
    
    void Cmenustack::Push(item *menu) {
        this->items[this->count] = menu;
        this->count++;
    }
    void Cmenustack::Pop() {
        this->count--;
        for(int i=0;i<this->count;i++)
            this->items[i] = this->items[i+1];
        this->items[this->count] = NULL;
    }
    
    item *Cmenustack::GetTopMenu() {
        return this->items[0];
    }
    

    dann ein abgeleitetes element:

    class CMainMenu : public item {
    public:
        virtual void Render();
    };
    void CMainMenu::Render() { printf("Hello World from MainMenu::Render()!!\n"); }
    
    //und das HP:
    
    int main(int argc, char *argv[]) {
        CMainMenu mainmenu;
        Cmenustack st;
        st.Push((CMainMenu*)&mainmenu);
        st.items[0].Render();
    //hier fehler -> Render wurde nicht deklariert..
        st.Pop();
        return 0;
    }
    


  • Klappt doch:

    class Item
    {
    public:
    	virtual void Render() const = 0;
    };
    
    class MainMenu : public Item
    {
    public:
    	virtual void Render() const;
    };
    
    void MainMenu::Render() const
    {
    	std::cout << "Hello World from MainMenu::Render()!!\n";
    }
    
    class MenuStack
    {
    	enum { MAX_STACK = 2 };
    
    private:
    	int		count;
    	Item	*items[ MAX_STACK ];
    
    public:
    	MenuStack();
    
    	void Push( Item *item );
    	Item *Pop();
    	Item *Top() const;
    };
    
    MenuStack::MenuStack()
    : count ( 0 )
    {}
    
    void MenuStack::Push( Item *item )
    {
    	assert( count < MAX_STACK && "Stack is full" );
    	items[ count++ ] = item;
    }
    
    Item *MenuStack::Pop()
    {
    	assert( count > 0 && "Stack is empty" );
    	return items[ --count ];
    }
    
    Item *MenuStack::Top() const
    {
    	assert( count > 0 && "Stack is empty" );
    	return items[ count-1 ];
    }
    


  • danke aber habs versucht:

    int main(int argc, char *argv[]) {
        MainMenu mainmenu;
        MenuStack st;
        st.Push(&mainmenu);
        st.Top().Render();
        st.Pop();
    return 0;
    }
    

    sagt schon wieder: "Render wurde nicht deklariert" in main()

    aber wenn ich jetzt kein array von items hab sondern nur ein *item
    dann funktionierts!



  • int main(int argc, char *argv[]) 
    {
        MainMenu mainmenu;
        MenuStack st;
        st.Push(&mainmenu);
        st.Top().Render(); /* Das ganze ist doch ein Pointer also müsste es wohl st.Top()->Render(); heißen!? */
        st.Pop();
        return 0;
    }
    

    Gruß



  • Dummie schrieb:

    st.Top().Render(); /* Das ganze ist doch ein Pointer also müsste es wohl
    

    So isses!



  • ähm oke den Wald vor lauter Bäumen nich gesehen, danke Leute!!



  • Du siehst den Baum immernoch nicht, denn der ist std::stack


Log in to reply