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

[SFML] std::vector

Ostatnio zmodyfikowano 2012-05-18 22:39
Autor Wiadomość
diego997
Temat założony przez niniejszego użytkownika
[SFML] std::vector
» 2012-05-18 21:08:21
Nie rozumie o co mu teraz chodzi po prostu pokarzę dwa kody przy jednym działa przy drugim nie.


NIE DZIAŁA:

C/C++
class _Button
{
    sf::Text Text;
public:
    void draw( sf::RenderWindow & );
   
}

void _Button::draw( sf::RenderWIndow & Window )
{
    Window.draw( Text );
}

int main()
{
    sf::RenderWindow Window(...);
    vector < _Button >( Button );
    Button.push_back( _Button( 100, 100, 30, "new", "Conviction.ttf", 700 ) );
   
    Button[ 0 ].draw( Window ); //Tu wywala błąd!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

DZIAŁA:

C/C++
class _Button
{
    sf::Text Text;
public:
    void draw( sf::RenderWindow & );
   
}

void _Button::draw( sf::RenderWIndow & Window )
{
    Window.draw( Text );
}


int main()
{
    sf::RenderWindow Window(...);
    _Button Button( 100, 100, 30, "new", "Conviction.ttf", 700 );
   
    Button.draw( Window );
}


EDIT:: NIE tylko tam wywala blad wywala w kazdym miejscu w ktorym chce sie odniesc do obiektu klasy
P-56935
Admixior
» 2012-05-18 21:22:40
A zamiast tworzyć zmienne chwilowe (konstruktorem do funkcji) to utwórz wskaźnik dodaj do vectora, zmień co potrzebne żeby to zrobić i później usuwaj dilejtem ;p.

Możliwe że sf::Text przechowuje wskaźnik do czegoś który jest po skończeniu funkcji usuwany (bo zmienna chwilowa już nie będzie potrzebna) a adres wskaźnika może być bez względnie skopiowany.
P-56936
szyx_yankez
» 2012-05-18 21:26:12
Spróbuj tak:
C/C++
int main()
{
    sf::RenderWindow Window(...);
    vector < _Button * >( Button );
    Button.push_back( new _Button( 100, 100, 30, "new", "Conviction.ttf", 700 ) );
   
    Button[ 0 ]->draw( Window );
}
P-56937
diego997
Temat założony przez niniejszego użytkownika
» 2012-05-18 21:26:23
tak problem gdzies jest po stronie sf::Text moge zmieniac jego pozycje natomiast nie moge przypisać stringa no i rysować tez






EDIT:: Masakra jesteście genialni a możecie mnie teraz oświecić dlaczego to zadziałało ? Teraz działam na tablicy dwuwymiarowej


Przeczytalem @Admixior 4 raz to co napisales i chyba zrozumialem ;p Tylko mozesz mi powiedziec co masz na mysli przez konsturktor do funkcji ?
P-56938
Admixior
» 2012-05-18 21:31:24
Napisałem w pierwszym poście możliwy problem. Może coś innego ale takie coś mi się nasuwa :)

//PS: nie trzeba usuwać deletem z vector każdego elementu? Czy to jest automatyczne?

@edit: Mam na myśli ten kawałek:
Button.push_back( _Button( 100, 100, 30, "new", "Conviction.ttf", 700 ) );
W nim masz konstruktor(tworzenie nowego obiektu). Tworzy się chwilowy obiekt. Po czym się kopiuje jego wartość do funkcji (bezwzględnie bit po bicie :), nawet wskaźniki). Funkcja się kończy i wykonuje się destruktor tej zmiennej chwilowej. Tak jakbyś miał nową zmienną w klamrach i wyszedłeś po za '}'.
Możesz sobie zrobić klasę która wypisuje w każdym konstruktorze "Konstruktor" i destruktorze "destruktor" oraz ilość elementów zmienną statyczną :)
Tak jak to zwykle robił J.Grębosz w swojej książce. Oraz zastosować po tym wskaźniki i jeszcze raz uruchomić program oraz zobaczyć różnice.
P-56939
diego997
Temat założony przez niniejszego użytkownika
» 2012-05-18 21:35:48
Sprawdze jedna rzecz jak zadziala to skumam co miales na mysli :D


EDIT:: Nie dziala czyli musisz wyjasnic mi co to jest zmienna chwilowa jak uzywam konstruktora ;p


Deklaracja wygląda tak _Button(float x, float y, float size, string text, string font, float checkFrom);

nie przesyłam ani razu sf::Text;


Najgorsze jest, że to zadziałało w drugim przypadku a w pierwszym nie chce
P-56940
Admixior
» 2012-05-18 22:18:42
Napisałem taki program:
C/C++
#include <vector>
#include <iostream>

using namespace std;

//stałe tekstowe
class klasa
{
public:
    char * wsk;
    klasa( char * txt )
        : wsk( txt )
    {
        cout << "\nKonstruktor:" << txt;
    }
    klasa( klasa & costam )
    {
        cout << "\nKonstruktor kopiujący(dla obiektu chwilowego).";
        wsk = "kopia chwilowa";
    }
    ~klasa()
    {
        cout << "\nDestruktor dla:" << wsk;
    }
};

int funkcja_przyjmujaca_wartosc( klasa wartosc )
{
    cout << "\nPrzez wartosc:" << wartosc.wsk << "\nnie mamy wplywu na destruktor ktory usunie np wazny wskaznik a w wektorze zostanie";
    return 0;
}
int funkcja_przyjmujaca_wskaznik( klasa * wartosc )
{
    cout << "\nPrzez wskaznik:" << wartosc->wsk;
    return 0;
}
int main()
{
    cout << "Tworzymy normalny obiekt.";
    klasa normal( "normalny obiekt" );
    {
        cout << "\na teraz w zakresie lokalnym";
        klasa unnormal( "lokalna klasa" );
        cout << "\na teraz destruktor bo klasa nie bedzie uzywana:";
    }
    //tak robiles do tej pory
    cout << "\nObiekt chwilowy:";
    funkcja_przyjmujaca_wartosc( klasa( "obiekt chwilowy" ) );
   
    //a tak robisz teraz
    klasa * do_delete;
    cout << "\nObiekt niechwilowy (new):";
    funkcja_przyjmujaca_wskaznik( do_delete = new klasa( "obiekt chwilowy" ) );
   
    cout << "\nDestruktor wskaznika na zyczenie:";
    delete do_delete;
    cout << "\ni koniec programu:";
    cin.get();
    return 0;
}

Tworzymy normalny obiekt.
Konstruktor:normalny obiekt
a teraz w zakresie lokalnym
Konstruktor:lokalna klasa
a teraz destruktor bo klasa nie bedzie uzywana:
Destruktor dla:lokalna klasa
Obiekt chwilowy:
Konstruktor:obiekt chwilowy
Przez wartosc:obiekt chwilowy
nie mamy wplywu na destruktor ktory usunie np wazny wskaznik a w wektorze zostan
ie
Destruktor dla:obiekt chwilowy
Obiekt niechwilowy (new):
Konstruktor:obiekt chwilowy
Przez wskaznik:obiekt chwilowy
Destruktor wskaznika na zyczenie:
Destruktor dla:obiekt chwilowy
i koniec programu:
//i to zobaczymy jak uruchomimy program przez konsole
Destruktor dla:normalny obiekt

Pokazuje on o co chodzi w tych obiektach chwilowych...
P-56944
diego997
Temat założony przez niniejszego użytkownika
» 2012-05-18 22:39:24
no ale w metodach istnieje cos takiego jak wskaznik this czyli nie jest usuwany obiekt klasy w tym przypadku sf::Text tylko string. Wiec dlaczego niby wektor sie pluje. Po co on ma trzymać wskaznik tego stringa ?



EDIT:: Ja w klasie nie mam zadnych wskaznikow
P-56946
« 1 »
  Strona 1 z 1