Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Undefinded reference przy funkcji zwracającej wspażnik na obiekt z wektora

Ostatnio zmodyfikowano 2014-05-12 19:57
Autor Wiadomość
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
C/C++
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:
C/C++
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(...);
P-109703
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.
P-109705
pekfos
» 2014-05-11 17:56:54
Zmień nazwę metody, albo kombinuj z #undef GetObject lub dołączaniem windows.h.
P-109706
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
P-109733
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 ;)
P-109749
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.
P-109753
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:
C/C++
//..
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
C/C++
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
C/C++
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;
       
    }
}
//////////DRAW///////////DRAW//////////////////////////////////////
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;
}
P-109762
pekfos
» 2014-05-12 11:17:02
Jaśniej prosze
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.
P-109776
« 1 » 2
  Strona 1 z 2 Następna strona