vector Problematik



  • Hey.

    Mal wieder ein Problem.
    Ich hab mir ein Klasse erstellt, mit welcher ich meine eig. Buttons erstellen und verwalten wollte. Also dachte ich mir, ich mach das über vectoren.

    Warum das ganze ?
    Ich muss ja später irgendwie überprüfen können, ob sich der Cursor im Rechteck des Buttons befindet.

    Nun wollte ich eben, dass jedes mal wenn eine neue Instanz der Klasse erstellt wird, dem Vector ein Element hinzugfügt wird, und wenn die Instanz beendet wird dieses Element wieder gelöscht wird.

    Das hier war emin Ansatzt, leider scheint es nicht zu funktionieren:

    MButon.h

    /*
    	MButton.h
    */
    #ifndef _MButton_H
    #define _MButton_H
    
    #include <string>
    #include <vector>
    #include <algorithm>
    
    class MButton
    {
    private:
    	bool activated;
    	std::string title;
    	int bColor;  // Background
    	int tColor;	 // Text
    	int hColor;	 // Mous hover
    	int boColor; // Border
    
    	//Bounds
    	int x1, y1, x2, y2;
    
    	static std::vector<MButton*> list;
    	static std::vector<MButton*>::iterator it;
    
    public:
    	//Konstruktor
    	MButton();
    	//Dekonstruktor
    	~MButton();
    
    	//Set Funktions
    	void SetTitle(std::string title);
    	void SetBounds(int x1, int y1, int x2, int y2);
    	void SetBackColor(int color);
    	void SetTextColor(int color);
    	void SetHoverColor(int color);
    	void SetBorderColor(int Color);
    	void Activate();
    	void Deactivate();
    
    	//Get Funktions
    	std::string *GetTitle();
    	int *GetBackColor();
    	int *GetTextColor();
    	int *GetHoverColor();
    	int *GetBorderColor();
    	bool isActivated();
    };
    #endif
    

    MButton.cpp

    #include "MButton.h"
    #include "MButtonConst.h"
    
    //Konstruktor
    MButton::MButton()
    {
    	//Set Defaults
    	activated = false;
    	title = "";
    	bColor = MB_DEFAULT_BACKCOLOR;
    	tColor = MB_DEFAULT_TEXTCOLOR;
    	hColor = MB_DEFAULT_HOVERCOLOR;
    	boColor = MB_DEFAULT_BORDERCOLOR;
    	MButton::list.push_back(this);
    }
    
    //Deekonstruktor
    MButton::~MButton()
    {
    	it = std::find(MButton::list.begin(), MButton::list.end(), this);
    	MButton::list.erase(it);
    }
    

  • Mod

    Darter schrieb:

    Das hier war emin Ansatzt, leider scheint es nicht zu funktionieren:

    Dann ist ja alles klar.



  • Ok, vllt etwas zu schlecht ausgedrückt, hier die Fehlermeldung die ich bekommen :

    1>MButton.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static class std::vector<class MButton *,class std::allocator<class MButton *> > MButton::list" (?list@MButton@@0V?$vector@PAVMButton@@V?$allocator@PAVMButton@@@std@@@std@@A)".
    1>MButton.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""private: static class std::_Vector_iterator<class std::_Vector_val<class MButton *,class std::allocator<class MButton *> > > MButton::it" (?it@MButton@@0V?$_Vector_iterator@V?$_Vector_val@PAVMButton@@V?$allocator@PAVMButton@@@std@@@std@@@std@@A)".
    1>C:\Users\Matze\Documents\Visual Studio 2010\Projects\AoG-Bot\Debug\AoG-Bot.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
    


  • Wieso ist der Vektor und der dazugehörige Iterator static ? Und zudem hast du die Regel der Drei nicht eingehalten. Und "nicht funktionieren" ist nicht sehr genau.



  • Ich war 6 Sekunden zu spät...
    Mach die beiden markierten Member einfach nicht static .



  • EOutOfResources schrieb:

    Wieso ist der Vektor und der dazugehörige Iterator static ?

    Hmm, Static hab ich sie declariert, da es ja sonst nichs bringen würde. Wäre es nicht stätic, würde bei jeder Instanz die erstellt wird eine neuer vector angelegt.


  • Mod

    EOutOfResources schrieb:

    Ich war 6 Sekunden zu spät...
    Mach die beiden markierten Member einfach nicht static .

    Nein! Das soll schon static sein, so wie der Threadersteller das will.

    @Threadersteller: Statische Member musst du auch irgendwo definieren, einfach nur in die Klassendefinition schreiben reicht da nicht. Das hat nichts mit deinem Programm im speziellen zu tun, das ist einfach allgemein so bei statischen Membern.

    Und das it sollte überhaupt kein Member sein, sondern nur im Destruktor leben.



  • SeppJ schrieb:

    Nein! Das soll schon static sein, so wie der Threadersteller das will.

    Sorry. Ich habe es nicht wirklich gelesen 🙄 .

    @Threadersteller

    //Code.hpp
    class foo
    {
      private:
        //bla
        static std::vector<MButton*> Liste;
      public:
        //bla
    };
    //Code.cpp
    std::vector<MButton*> foo::Liste = std::vector<MButton*>();
    


  • Klasse, ich danke euch, funktioniert einwandfrei 🙂

    Edit:
    Ich hab nur noch ein kleines Logigproblem.

    Also ich baue das ganze auf SDL auf.
    Ich hab ne Klasse Core , über welche ich ein Fentser und nen Backbuffer anlege, auf welche einfach alles aufbaut.
    Auch der Mainloop befindet sich in diese Klasse.

    Jetzt meine Frage:
    Wie füge ich alles zusammen, sodass sich meine Klasse MButton selbst um das darstellen der Buttons kümmern kann?



  • Darter schrieb:

    Klasse, ich danke euch, funktioniert einwandfrei 🙂

    Nun solltest du allerdings noch beachten, dass natürlich auch Buttons durch den copy-constructor erstellt werden könnten. Diese würden momentan allerdings nicht in deinem vector geführt.

    Nun überleg, was passiert, wenn solch ein Objekt zerstört wird. Im Destruktor suchst du im vector nach der Adresse mittels find.
    find liefert dir allerdings einen Iterator auf Liste.end() wenn das gesuchte Element nicht in deiner list ist (und das ist ein per CCTOR erstelltes Objekt momentn nunmal nicht).

    Jetzt hast du ein Problem beim Aufruf von list.erase(it). 😃



  • Gut, das ist ja dann kein großer Akt. 🙂
    Aber natürlich danke für den Hinweis
    Allerdings verweise ich nochmal auf meinen letzten Post, da mir dies mehr Probleme macht.


Log in to reply