Seltsames Verhalten welches ich nicht im Threadtitel beschreiben kann



  • Hi

    ich steh hier wieder mal vor einem Problem das ich nicht verstehe:
    Ich habe 3 Klassen: "MainMenu", "ScrollableList", und "ScrollableListElement". Die "ScrollableList"en sind keine LinkedLists oder so, sondern einfach Listen von "ScrollableListElement"en die auf den Bildschirm gerendert werden, und die eiene Scrollbar haben. Das "MainMenu" speichert dabei beliebig vieler solcher "ScrollableList"en. In einer "ScrollableList" kann jeweils ein "ScrollableListElement" 'aktiv' sein, d.h. einfach dass eines (das aktive) dieser Elemente beim rendern farbig hinterlegt wird.

    Das war der Prolog. Es ist bei mir so dass ich wenn ich mein "MainMenu" erstelle im Konstruktor eine neue "ScrollableList" erstellt wird, davon das erste Element 'aktiviert' wird, und die ScrollableList im MainMenu gespeichert wird. Das funktioniert.

    MainMenu.h

    class MainMenu {
    
    private:
    	std::vector<ScrollableList> menu_list;
    	int active_menu;
    	// [...]
    
    public:
    	MainMenu();
    	void add_menu();
    	// [...]
    };
    

    MainMenu.cpp:

    void MainMenu::add_menu() {
    
    	ScrollableListElement *elementenliste = new ScrollableListElement[10];	// wird noch nicht gelöscht
    
    	for(int i=0; i<10; i++) {
    		elementenliste[i] = ScrollableListElement("Element");
    	}
    
    	this->menu_list.push_back(ScrollableList(elementenliste, 10));
    
    	this->menu_list.back().set_active_element(0);  // Das speichert in der ScrollableList dass das erste element aktiviert wird
    }
    
    MainMenu::MainMenu()
    {
    	this->add_menu();
    	this->active_menu = 1;
    }
    

    Wenn ich jetzt in einer weiteren Methode des MainMenus welche bei einem Tastendruck aufgerufen wird ein anderes Element 'aktiviere', wird entsprechend der Methode ScrollableList.set_active_element(int i) zwar das im moment ausgewählte Element (das erste) deaktiviert, aber kein anderes aktiviert. Aktiviere ich mit einem anderen Tastendruck wieder das erste Element wird dieses wieder aktiv angezeigt. Also ich kann ScrollableList.set_active_element(int i) für alle Elemente i aufrufen, aber nur bei dem ersten wird dieses auch als aktiv angezeigt. Der Code dazu sieht wie folgt aus:

    MainMenu.cpp:

    void MainMenu::btn_up_pushed() {
    	this->menu_list.at(this->active_menu).set_active_element(5);  // tut nicht wie es soll egal mit welcher zahl
    }
    
    void MainMenu::btn_down_pushed() {
    	this->menu_list.at(this->active_menu).set_active_element(0);  // erstes element wird wieder als aktiv angezeigt
    }
    

    ScrollableList.h:

    class ScrollableList : public Controllable, public GuiObject {
    
    private:
    	ScrollableListElement *list_elements;
    	int num_list_elements;
    	int active_element;
    	// [...]
    
    public:
    	ScrollableList(ScrollableListElement list[], int length);
    	ScrollableList(const ScrollableList &sl);
    	// [...]
    };
    

    ScrollableList.cpp:

    ScrollableList::ScrollableList(ScrollableListElement *list, int length) {
    	this->list_elements = list;
    	this->num_list_elements = length;
    	this->active_element = 0;
    }
    
    ScrollableList::ScrollableList(const ScrollableList &sl)
    {
    	this->list_elements = new ScrollableListElement[sl.num_list_elements];
    
    	for(int i=0; i<sl.num_list_elements; i++) {
    		this->list_elements[i] = sl.list_elements[i];
    	}
    
    	this->num_list_elements = sl.num_list_elements;
    	this->active_element = sl.active_element;
    }
    
    void ScrollableList::set_active_element(int i)
    {
    	this->list_elements[this->active_element].set_is_active(false);
    	this->list_elements[i].set_is_active(true);
    	this->active_element = i;
    }
    

    ScrollableListElement.h:

    class ScrollableListElement {
    
    private:
    	std::string title;
    	bool is_active;
    
    public:
    	ScrollableListElement(std::string t);
    
    	bool get_is_active();
    	void set_is_active(bool b);
    };
    

    ScrollableListElement.cpp

    ScrollableListElement::ScrollableListElement(std::string t)
    {
    	this->title = t;
    	is_active = false;
    }
    

    Was ich auch vor allem nicht verstehe, es wird so immer nur angezeigt wenn das erste Element aktiv ist, wenn ich aber im Konstruktor von ScrollableListElement is_active standardmäßig auf true setze, kann ich dann später vom MainMenu aus jedes Element mit ScrollableList.set_active_element(int i) aktivieren und deaktivieren.

    Ich versteh's echt nicht, denk es ist vielleicht wieder irgend so ne speicherverwaltungssache oder so...

    Grüße
    Lukas



  • PS: Es ist außerdem so, wenn ich, so als Quick&Dirty Workaround die ScrollableListElements standardmäßig auf true setze und dann im MainMenu.add_menu() alle items der ScrollableList in einer schleife durchgehe und mit set_active_element(i) deaktiviere hab ich den gleichen effekt wie wenn ich sie von anfang an auf false setze, wenn ich das gleiche beim drücken des buttons mache funktionierts, und wenn ich das gleiche im MainMenu konstruktor mache stürzt er ab, also liegt's wahrscheinlich noch eher an so speicherkram.


Anmelden zum Antworten