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

[SFML, C++] Błąd: "lvalue required as left operand of assignment"

Ostatnio zmodyfikowano 2011-07-25 16:12
Autor Wiadomość
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":
C/C++
#include "okno.hpp"

int main()
{
    //utworzenie wskaznika na obiekt okno klasy WINDOW
    WINDOW * okno;
    okno = new WINDOW;
    //zmiana szerokosci i wysokosci tworzonego okna
    okno->zmien_szerokosc( 800 ); okno->zmien_wysokosc( 600 );
    //utworzenie okna
    okno->rysuj_okno();
    //petla glowna
    while( okno->okno_glowne.IsOpened() )
    {
        //obsluga zdarzen
        while( okno->okno_glowne.GetEvent( okno->zdarzenie ) )
        {
            if( okno->zdarzenie.Type == Event::KeyPressed && okno->zdarzenie.Key.Code == Key::Escape )
            {
                okno->okno_glowne.Close();
            };
        };
        //rysowanie okna
        okno->okno_glowne.Clear( Color( 100, 100, 200 ) );
        okno->okno_glowne.Display();
    };
    return 0;
}

Plik "okno.hpp":
C/C++
#ifndef okno_hpp
#define okno_hpp
//dodawanie bibliotek
#include <SFML\Window.hpp>
#include <SFML\Graphics.hpp>
#include <cstdlib>
#include <iostream>
//przestrzenie nazw
using namespace sf;
using namespace std;
//utworzenie klasy
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; }; //zamienia stara szerokosc na nowa
    void zmien_wysokosc( int nowa_wysokosc ) { wysokosc = nowa_wysokosc; }; //zamienia stara szerokosc na nowa
    RenderWindow okno_glowne;
    WINDOW() { szerokosc = 640; wysokosc = 480; & sterowanie = okno_glowne.GetInput(); };
    ~WINDOW();
    void rysuj_okno();
   
};

#endif

Plik "okno.cpp":
C/C++
#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.
P-36931
malan
» 2011-07-25 13:29:35
Gdzie nabyłeś takie nawyki pisania?
C/C++
WINDOW()
{
    szerokosc = 640;
    wysokosc = 480;
    sterowanie = okno_glowne.GetInput();
}
Poza tym - czy tego (
sterowanie = okno_glowne.GetInput();
) nie powinno pobierać się na bieżąco?
P-36932
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.
P-36976
malan
» 2011-07-25 15:56:25
No, bo obiekt musi być stały, czyli Twoje rozwiązanie odpada.
P-36980
imralav
Temat założony przez niniejszego użytkownika
» 2011-07-25 15:57:35
Rozwiązałem problem wstawiając taki konstruktor:
C/C++
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ą?
P-36982
akwes
» 2011-07-25 16:01:27
Bo obiekty const muszą być odrazu definiowane w momencie inicjalizacji ?
C/C++
// BLAD
const int ala;
ala = 3;
 
C/C++
// OK
const int ala = 3;
 

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.
C/C++
Game::Game( const sf::Input * b )
{
    sterowanie = b;
}
 
C/C++
// W main
Game obiekt = new Game( & sterowanie );
P-36987
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.
P-36989
« 1 »
  Strona 1 z 1