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: 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 ); }
DZIAŁA: 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 |
|
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. |
|
szyx_yankez |
» 2012-05-18 21:26:12 Spróbuj tak:
int main() { sf::RenderWindow Window(...); vector < _Button * >( Button ); Button.push_back( new _Button( 100, 100, 30, "new", "Conviction.ttf", 700 ) ); Button[ 0 ]->draw( Window ); } |
|
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 ? |
|
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. |
|
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 |
|
Admixior |
» 2012-05-18 22:18:42 Napisałem taki program: #include <vector> #include <iostream>
using namespace std;
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:"; } cout << "\nObiekt chwilowy:"; funkcja_przyjmujaca_wartosc( klasa( "obiekt chwilowy" ) ); 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... |
|
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 |
|
« 1 » |