• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Metoda jednej klasy wywoływane w metodzie innej klasy

Object Storage Arubacloud
0 głosów
1,469 wizyt
pytanie zadane 31 października 2017 w C i C++ przez LekarZ Nowicjusz (140 p.)
edycja 1 listopada 2017 przez LekarZ

Projekt SFML

Posiadam w projekcie 2 klasy. Klasę Gra oraz klasę Menu. W klasie Gra posiadam metodę, która będzie obsługiwać całą gre(wyświetlanie okna, rysowanie sprajtów, obsługa zdarzeń itp). W klasie Menu mam stworzoną metodę, która jako argument przyjmuje referencje do obiektu klasy RenderWindow, który jest moim oknem a następnie wypisuje poszczególne opcje mojego menu. Chcę aby metoda wypisująca moje menu(klasa Menu), została wywołana metodzie odpowiedzialnej za całą grę (klasa Gra). Czy jest w ogóle możliwe by metodę jednej klasy, której argumentem jest obiekt klasy dostępnej w bibliotece SFML, wywołać w innej metodzie? Zachęcam do wspólnej dyskusji. 

#include <SFML/Graphics.hpp>
#include "gra.h"
#include <iostream>
#include "menu.h"

using namespace std;
using namespace sf;


Gra :: Gra()
{
    stan_gry stan=men;
    tlo_gry.loadFromFile("2.png");
    tlo_gry_sprite.setTexture(tlo_gry);
    tlo_gry_sprite.setPosition(-100,0);
}
void Gra::rysuj()
{
        RenderWindow okno(VideoMode(800,600), "Audi <3");
        Event zdarzenie;

        while( okno.isOpen())
    {

        while( okno.pollEvent( zdarzenie ) )
        {
            if( zdarzenie.type == Event::Closed )
                 okno.close();

        }

        okno.clear();

        okno.draw(tlo_gry_sprite);
        // Tutaj w metodzie klasy Gra chce wywolac metode klasy Menu, ktora wypisuje menu

        okno.display();
    }
}
#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;
using namespace sf;

class Menu;

class Gra
{


Texture tlo_gry;
Sprite tlo_gry_sprite;

enum stan_gry{rozgrywka, zamknij, men};

public:

    void rysuj();
    Gra();

};
#include <SFML/Graphics.hpp>
#include "menu.h"
#include <iostream>
#include "gra.h"

#define ROZMIAR_MENU 3

using namespace std;
using namespace sf;

void Menu :: rysujmenu(RenderWindow& okno)
{
    for(int i=0; i<=2; i++)
    {
        okno.draw(opcje[i]);

    }
}

Menu :: Menu()
{
    string wypelnienie[]={"Graj", "Statystyki", "Zakoncz"};
    Font czcionka;

    if(!czcionka.loadFromFile("Comfortaa Regular.ttf"))
    {
        //Blad
    }
    opcje[0].setPosition(610,80);
    opcje[1].setPosition(610,130);
    opcje[2].setPosition(610,180);


    for(int i=0; i<ROZMIAR_MENU; i++)
    {   
        opcje[i].setFont(czcionka);
        opcje[i].setCharacterSize(42);
        opcje[i].setColor(Color::Cyan);
        opcje[i].setString(wypelnienie[i]);

    }
}
#include <SFML/Graphics.hpp>
#include <iostream>

#define ROZMIAR_MENU 3

using namespace std;
using namespace sf;

class Gra;

class Menu
{
    string wypelnienie[];
    Text opcje[ROZMIAR_MENU];

public:

    void rysujmenu(RenderWindow& okno);
    Menu();


};

1 odpowiedź

+1 głos
odpowiedź 1 listopada 2017 przez criss Mędrzec (172,590 p.)

Ale w czym problem? Niech obiekt Menu będzie memberem klasy Gra (albo obiektem lokalnym wewnątrz Gra::rysuj tak jak to zrobiłeś z `okno`, ale imo to dziwne) i wtedy wołaj obiektMenu.rysujmenu(okno); 

komentarz 1 listopada 2017 przez LekarZ Nowicjusz (140 p.)
edycja 1 listopada 2017 przez LekarZ
Po utworzeniu obiektmenu w klasie Gra (jako składowa tej klasy) pojawia się błąd "field "obiektmenu" has incomplete type "Menu"". Mogę otworzyć w ten sposób wskaźnik pokazujący na obiekt klasy Menu. Idąc drugim tropem, tworząc obiekt klasy Menu w metodzie klasy Gra, jest prawie ok. Obiekt zostaje stworzony natomiast gdy w odpowiednim miejscu tej metody chce wywołać metodę wypisującą menu, program  zawiesza się, nawet background nie jest wyświetlany. Białe tło i informacja "Program projekt.exe przestał działać".
komentarz 1 listopada 2017 przez criss Mędrzec (172,590 p.)

Po utworzeniu obiektmenu w klasie Gra (jako składowa tej klasy) pojawia się błąd "field "obiektmenu" has incomplete type "Menu"".

Zaincluduj (#include) header z klasą Gra.

Co do 2) - może to przez brak ustawionego fonta?

komentarz 1 listopada 2017 przez LekarZ Nowicjusz (140 p.)
Fonty, kolory, pozycje opcji menu, rozmiary czcionek sa ustawione. Próbowałem rozwiązać ten problem w następujący sposób. Stworzenie obiektu klasy Menu w mainie i przekazanie go do metody klasy Gra, lecz gdy odwołam się w tej metodzie do metody z Menu, efekt występuje ten sam co przy tworzeniu obiektmenu bezposrednio w metodzie gra.rysuj. Białe tło i informacja, że exe przestał działać. W każdym pliku .cpp sa zaicludowane wszystkie headery.
komentarz 1 listopada 2017 przez criss Mędrzec (172,590 p.)

W każdym pliku .cpp sa zaicludowane wszystkie headery.

... W pliku w którym masz błąd :P Czyli w Gra.h zaincluduj Menu.h. Jeśli częścią definicji klasy Gra jest obiekt Menu, to definicja klasa Menu musi być w pełni znana.

Fonty, kolory, pozycje opcji menu, rozmiary czcionek sa ustawione.

Gdzie? Fontów nie widze. 

komentarz 1 listopada 2017 przez LekarZ Nowicjusz (140 p.)
W moim kodzie czcionki były ładowane natomiast pisząc to zapytanie, przeoczyłem ten fakt. Moja wina. Kod już powyżej się znajduje. Po zaincludowaniu w pliku gra.h pliku menu.h pojawia się komunikat "previous definition of 'class Menu'".
komentarz 1 listopada 2017 przez criss Mędrzec (172,590 p.)

Aha, nie masz include guardów. Dodaj #pragma once na początku każdego headera. I wygoogluj "include guards c++" żeby doczytać temat.

komentarz 1 listopada 2017 przez LekarZ Nowicjusz (140 p.)
Czuję w kościach, że prawie udało się dojść do oczekiwanego rezultatu. Zrobiłem dla testu metode test, ktora wyświetla w konsoli napis test. Gdy utworze obiekt menuobiekt w klasie Gra, jest wszystko ok. Gdy odwolam sie operatorem kropki do metody test, która nie pobiera żadnych argumentów i również żadnych nie zwraca, działa bez zarzutu, napis test jest wyświetlany. Natomiast gdy odwołam się do metody rysującej menu, która jako argument przyjmuje obiekt okno klasy RenderWindow, pojawia się białe okno i komunikat, że exe przestał działać. Metoda(klasy Gra), która jest odpowiedzialna za całą grę ma zdefiniowany obiekt okno typu RenderWindow, i korzysta z niego wielokrotnie.
komentarz 1 listopada 2017 przez criss Mędrzec (172,590 p.)
Hm wrzuć teraz wersje kodu, która powoduje crash. Chyba, że to nadal to samo?

Dodatkowo zauważyłem, że obiekt czcionki jest lokalny w konstruktorze Menu (tzn. po wykonaniu konstruktora, załadowana czcionka idzie sobie na wieczny odpoczynek), więc w chwili rysowaniu napisów już jej nie ma. Obiekty Text trzymają w sobie wskaźnik na nie istniejący już obiekt czcionki. Jak dla mnie to nie ma prawa się renderować.

To pewnie rozwiąże problem. Jeśli tak, to już nie wrzucaj kodu ofc.
komentarz 1 listopada 2017 przez LekarZ Nowicjusz (140 p.)
Nie zauważyłem tego faktu o nieistniejącej czcionce, co wywoływało crash. Poprawiłem i menu zostaje wyświetlone. Dziękuję bardzo za poświęcony czas, cierpliwość i pomoc.
komentarz 1 listopada 2017 przez criss Mędrzec (172,590 p.)
Prosze bardzo :)

Podobne pytania

0 głosów
2 odpowiedzi 1,078 wizyt
0 głosów
3 odpowiedzi 202 wizyt
pytanie zadane 25 stycznia 2016 w C i C++ przez lukasz_m Obywatel (1,380 p.)
0 głosów
0 odpowiedzi 175 wizyt

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...