[SFML, C++] Błąd: "lvalue required as left operand of assignment"
Ostatnio zmodyfikowano 2011-07-25 16:12
imralav Temat założony przez niniejszego użytkownika |
[SFML, C++] Błąd: "lvalue required as left operand of assignment" » 2011-07-25 13:05:41 Witam. Przejdę od razu do rzeczy - utworzyłem klasę obsługującą okno główne aplikacji. Tworzy okno, obsługuje zdarzenia. Zabrakło mi tu tylko bezpośredniego dostępu do myszy. I tu się właśnie zacinam. Pozwolę C::B wyjaśnić problem dogłębniej: Plik "main.cpp": #include "okno.hpp"
int main() { WINDOW * okno; okno = new WINDOW; okno->zmien_szerokosc( 800 ); okno->zmien_wysokosc( 600 ); okno->rysuj_okno(); while( okno->okno_glowne.IsOpened() ) { while( okno->okno_glowne.GetEvent( okno->zdarzenie ) ) { if( okno->zdarzenie.Type == Event::KeyPressed && okno->zdarzenie.Key.Code == Key::Escape ) { okno->okno_glowne.Close(); }; }; okno->okno_glowne.Clear( Color( 100, 100, 200 ) ); okno->okno_glowne.Display(); }; return 0; }
Plik "okno.hpp": #ifndef okno_hpp #define okno_hpp
#include <SFML\Window.hpp> #include <SFML\Graphics.hpp> #include <cstdlib> #include <iostream>
using namespace sf; using namespace std;
class WINDOW { private: int szerokosc, wysokosc, lmysz_x, lmysz_y, gmysz_x, gmysz_y; public: Event zdarzenie; const Input & sterowanie; int wez_szerokosc() { return szerokosc; }; int wez_wysokosc() { return wysokosc; }; void zmien_szerokosc( int nowa_szerokosc ) { szerokosc = nowa_szerokosc; }; void zmien_wysokosc( int nowa_wysokosc ) { wysokosc = nowa_wysokosc; }; RenderWindow okno_glowne; WINDOW() { szerokosc = 640; wysokosc = 480; & sterowanie = okno_glowne.GetInput(); }; ~WINDOW(); void rysuj_okno(); };
#endif
Plik "okno.cpp": #include "okno.hpp"
void WINDOW::rysuj_okno() { okno_glowne.Create( VideoMode( WINDOW::wez_szerokosc(), WINDOW::wez_wysokosc(), 32 ), "SFML cz 8 - Wmieszajmy w to klasy!", Style::None ); okno_glowne.SetFramerateLimit( 60 ); };
I "Build messages": \okno.hpp||In constructor 'WINDOW::WINDOW()':| \okno.hpp|24|error: uninitialized reference member 'WINDOW::sterowanie'| \okno.hpp|24|error: lvalue required as left operand of assignment| ||=== Build finished: 2 errors, 0 warnings ===|
|
Jak temu zaradzić? Pozdrawiam, imralav. |
|
malan |
» 2011-07-25 13:29:35 Gdzie nabyłeś takie nawyki pisania? WINDOW() { szerokosc = 640; wysokosc = 480; sterowanie = okno_glowne.GetInput(); } Poza tym - czy tego ( sterowanie = okno_glowne.GetInput(); ) nie powinno pobierać się na bieżąco? |
|
imralav Temat założony przez niniejszego użytkownika |
» 2011-07-25 15:28:04 Nie naprawia to problemu a tworzy nowe: ||=== SFMl - cz8 - Wmieszajmy w to klasy!, Debug ===| \okno.hpp||In constructor 'WINDOW::WINDOW()':| \okno.hpp|24|error: uninitialized reference member 'WINDOW::sterowanie'| \okno.hpp|28|error: passing 'const sf::Input' as 'this' argument of 'sf::Input& sf::Input::operator=(const sf::Input&)' discards qualifiers| E:\works\c++\SFML-1.6\include\SFML\System\NonCopyable.hpp||In member function 'sf::Input& sf::Input::operator=(const sf::Input&)':| E:\works\c++\SFML-1.6\include\SFML\System\NonCopyable.hpp|64|error: 'sf::NonCopyable& sf::NonCopyable::operator=(const sf::NonCopyable&)' is private| E:\works\c++\SFML-1.6\include\SFML\Window\Input.hpp|45|error: within this context| \okno.hpp||In constructor 'WINDOW::WINDOW()':| \okno.hpp|28|note: synthesized method 'sf::Input& sf::Input::operator=(const sf::Input&)' first required here | ||=== Build finished: 4 errors, 0 warnings ===|
|
Jakieś inne pomysły? Pisząc "na bieżąco" masz na myśli w głównej pętli? Zawsze było przed nią i działało dobrze. |
|
malan |
» 2011-07-25 15:56:25 No, bo obiekt musi być stały, czyli Twoje rozwiązanie odpada. |
|
imralav Temat założony przez niniejszego użytkownika |
» 2011-07-25 15:57:35 Rozwiązałem problem wstawiając taki konstruktor: WINDOW() : sterowanie( okno_glowne.GetInput() ) { szerokosc = 640; wysokosc = 480; };
Teraz tylko pytanie skąd to się bierze? Dlaczego sterowanie(okno_glowne.GetInput()) |
nie jest zamknięte w klamrach razem z szerokością i wysokością? |
|
akwes |
» 2011-07-25 16:01:27 Bo obiekty const muszą być odrazu definiowane w momencie inicjalizacji ? Natomiast tutaj można dużo prościej i szybciej (bez kopiowania całego obiektu), przekazywać sobie informacje przez wskaźnik na obiekt stały. Game::Game( const sf::Input * b ) { sterowanie = b; }
Game obiekt = new Game( & sterowanie );
|
|
imralav Temat założony przez niniejszego użytkownika |
» 2011-07-25 16:12:07 Jasne. Po prostu jak dotąd nigdzie nie spotkałem się z czymś, co wikipedia nazywa listą inicjalizacyjną konstruktora.
Dzięki, zamykam. |
|
« 1 » |