colorgreen19 Temat założony przez niniejszego użytkownika |
Undefinded reference przy funkcji zwracającej wspażnik na obiekt z wektora » 2014-05-11 17:39:30 class Palete : public Widget { public: Palete(); void AddWidget( Widget * widget, string widgetname ) { Object * object = new Object; object->widget = widget; object->name = widgetname; object->posX = widget->GetPosition().x; object->posY = widget->GetPosition().y; Objects.push_back( object ); } void SetInternalPtr( string onObject ) { for( int i = 0; i < Objects.size(); i++ ) { if( onObject == Objects[ i ]->name ) { internalptr = Objects[ i ]; } } } void Draw( RenderWindow * okno ); struct Object { Widget * widget; string name; float posX, posY; }; Object * GetObject() { return internalptr; } protected: private: Object * internalptr; std::vector < struct Object * > Objects; };
Tak wygląda klasa i teraz o co chodzi: Widget * w = new Widget; w->SetPosition( 125, 23 ); playerInfo.AddWidget( w, "Hp" );
w = new Widget; w->SetPosition( 125, 46 + 11 ); playerInfo.AddWidget( w, "Sp" );
playerInfo.SetInternalPtr( "Hp" ); playerInfo.GetObject()->widget->foo(...);
Dodaje widgety do palety (wskaźniki na widgety do wektora ). Każdy widget dostaje nazwe (w postaci stringa). Klasa zawira w środku wskaźnik, który można ustawiac na który widget z wektora ma pokazywać, bo móc tym widgetem "zarządzać". Wyskakuje błąd undefinded reference to 'Palete::GetObjectA()' dla linijki playerInfo.GetObject()->widget->foo(...); |
|
killjoy |
» 2014-05-11 17:54:40 Inkludujesz pewnie windows.h , który zawiera makro zmieniające GetObject na GetObjectA. Rozwiąznaie: zmień nazwę metody, np. napisz ją z małej litery. |
|
pekfos |
» 2014-05-11 17:56:54 Zmień nazwę metody, albo kombinuj z #undef GetObject lub dołączaniem windows.h. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-11 20:13:52 Zmieniłem nazwe funkcji, podziałało, ale program crashuje się gdy próbuje wywołać cokolwiek z tego; tzn czy to jest playerInfo.GetWidget()->widget->GetRect().left; czy playerInfo.GetWidget()->widget->GetSize().x; lub playerInfo.GetWidget()->posX; zawsze się wysypuje. Jakieś pomysły? Chyba wskaźnik "strzela" na ślepo ale bo by było dziwne |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-11 21:14:41 Rozumiem, że nie wiecie co się może dziać. To jakiś pomysł żeby to obejść? (paleta jest jakby grupą Widgetów i jego pochodnych (czyli buttonów, listboxów itd) ma byc uniwersalna, tworzona odpowienio i w ogole... myśle że wiecie o co mi chodzi ;) |
|
pekfos |
» 2014-05-11 21:35:28 Odwołujesz się do niepoprawnego adresu, prawdopodobnie. Nie widzimy, co masz w kodzie, poza tymi urywkami. Dodam jeszcze, że pomysł na GetWidget()+SetInternalPtr() nie jest najlepszy. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-05-11 22:10:26 Dodam jeszcze, że pomysł na GetWidget()+SetInternalPtr() nie jest najlepszy. |
Jaśniej prosze Wszystko co jest związane z tym: Palete playerInfo;
Widget * w = new Widget; w->SetBackground( "Files/tex/HpTemplate.png" ); w->SetSpriteColor( Color( 202, 49, 49 ) ); w->SetPosition( 125, 23 ); playerInfo.AddWidget( w, "Hp" );
w = new Widget; w->SetBackground( "Files/tex/HpTemplate.png" ); w->SetSpriteColor( Color( 0, 80, 210 ) ); w->SetPosition( 125, 46 + 11 ); playerInfo.AddWidget( w, "Sp" );
w = new Widget; w->SetBackground( "Files/tex/HpTemplate.png" ); w->SetSpriteColor( Color( 195, 157, 52 ) ); w->SetPosition( 125, 69 + 22 ); playerInfo.AddWidget( w, "Exp" );
playerInfo.SetInternalPtr( "Hp" ); playerInfo.GetWidget()->widget->GetSprite().setTextureRect( sf::IntRect( 0, 0, player->GetHp() * playerInfo.GetWidget()->widget->GetSize().x / player->GetHpMax(), playerInfo.GetWidget()->widget->GetSize().y ) );
playerInfo.Draw( okno );
Paleta.h class Palete : public Widget { public: Palete(); void SetPosition( int positionX, int positionY ); void AddWidget( Widget * widget, string widgetname ); void SetInternalPtr( string onObject ); void Draw( RenderWindow * okno ); struct Object { Widget * widget; string name; float posX, posY; }; Object * GetWidget(); protected: private: Object * internalptr; std::vector < struct Object * > Objects; };
Paleta.cpp using namespace sf; using namespace std;
Palete::Palete() { internalptr = NULL; }
void Palete::SetPosition( int positionX, int positionY ) { m_positionX = positionX; m_positionY = positionY; rect.left = m_positionX; rect.top = m_positionY; m_RectangleShape.setPosition( m_positionX, m_positionY ); m_Text.setPosition( m_positionX + m_textOffsetX, m_positionY + m_textOffsetY ); m_Sprite.setPosition( m_positionX, m_positionY ); for( int i = 0; i < Objects.size(); i++ ) { Objects[ i ]->widget->SetPosition( Objects[ i ]->posX + m_positionX, Objects[ i ]->posY + m_positionY ); } }
void Palete::AddWidget( Widget * widget, string widgetname ) { Object * object = new Object; object->widget = widget; object->name = widgetname; object->posX = widget->GetPosition().x; object->posY = widget->GetPosition().y; Objects.push_back( object ); }
void Palete::SetInternalPtr( string onObject ) { for( int i = 0; i < Objects.size(); i++ ) { if( onObject == Objects[ i ]->name ) { cout << "InternalPtr on Objects[" << i << "]->name " << Objects[ i ]->name << endl; internalptr = Objects[ i ]; } else internalptr = NULL; } }
void Palete::Draw( RenderWindow * okno ) { if( background ) { okno->draw( m_RectangleShape ); okno->draw( m_Text ); } else { okno->draw( m_Sprite ); okno->draw( m_Text ); } for( int i = 0; i < Objects.size(); i++ ) { Objects[ i ]->widget->Draw( okno ); } }
Palete::Object * Palete::GetWidget() { return this->internalptr; }
|
|
pekfos |
» 2014-05-12 11:17:02 Zła implementacja SetInternalPtr(). Po zmianie, nie może wskazywać na poprzedni widget. A nie, poprawiłeś.. A przynajmniej tak myślisz, bo to tylko pogorszyło sprawę. W każdym razie, masz możliwość (a teraz prawie pewność) otrzymania nulla z GetWidget(), więc musisz sprawdzać poprawność wskaźnika. W tym przypadku lepiej już jest zapisać raz zwróconą wartość i odwoływać się do zmiennej - no i wypada sens rozdzielania tych dwóch metod. |
|
« 1 » 2 |