Rozwiązanie problemu dostępu do klas

0

Mam problem z rozwiązaniem problemu. Mam klasę FileManager, którego obiekt umieszczam w klasie MenuScreen. Jest w tej klasie też tablica vectorów klasy Button. Klasa Button ma w priv: tekst,pozycję, oraz obrazek. FileManager ma ładować obrazek i tekst z pliku do danego obiektu klasy Button.

Do metody klasy FileManager muszę przesłać te tablicę Buttonów, żeby wgrać tam dane, ale są one prywante. Nie wiem jak to skonstruować żeby w managerze załadować dane do buttonów.

1

Stwierdziles, ze lepiej opisac kod niz go pokazac?

0
 class MenuScreen : public GameScreen
{

private:
    ALLEGRO_FONT *font;
    InputManager input;

    vector<Button> button;

    FileManager fileManager;

public:
    MenuScreen(void);
    ~MenuScreen(void);

    virtual void LoadContent();
    virtual void UnloadContent();
    virtual void Update(ALLEGRO_EVENT ev);
    virtual void Draw(ALLEGRO_DISPLAY *display);
};

I klasa filemanagera:

 class FileManager
{
public:
    FileManager();
    ~FileManager();

    void LoadContent(const char *filename, vector<Button>button);
};

W klasie MenuScreen jest metoda LoadContent gdzie jest wywoływana metoda z FileManagera. W tej funkcji muszą być wypełnione prywatne dane Buttonów:

 class Button
{
private:
    string text;
    ALLEGRO_BITMAP* buttonImage;
    pair<float,float> position;

public:
    Button();
    ~Button();

    void Draw(ALLEGRO_DISPLAY *display);
};
0

No i jaki jest problem?

0

File Manager nie ma dostępu do prywatnych składowych Button, a musi je jakoś wypełnić.

2

Ok

class Button
{
public:
  void setSkladowa(int nowa_wartosc) { skladowa=nowa_wartosc; }


private:
  int skladowa;
};
0

Warto dodać że jeżeli to jedyna taka składowa to można zrobić też taki myk:

class Button
  {
   private:
   int skladowa;
   public:
   Button(int skladowa):skladowa(skladowa) {}
   operator int()const { return skladowa; }
  };
...
Button b(666);
int x=b;
b=777;
0

Nie jedyna, muszę tam przekazać string oraz "image".

0

Ale nie koniecznie musisz je wprost pobierać/podmieniać.

0

Co to znaczy wprost, chcę żeby wszystkie akcje tego typu odbyły się w file managerze. Więc tam otwieram plik, wczytuje co trzeba i przypisuję (a raczej staram się) do prywatnych danych Buttonów. Użyję tych setterów :)

1

Nie powinieneś robić tego:

class Button
  {
   private:
   string text;
   ALLEGRO_BITMAP* buttonImage;
   pair<float,float> position;
   public:
   Button(const string &text,ALLEGRO_BITMAP* buttonImage,pair<float,float> position):text(text),buttonImage(buttonImage),position(position) {}
   void Draw(ALLEGRO_DISPLAY *display);
  };

i nie potrzebujesz żadnych setterów

0

Dopiero zaczynam ogarniać programowanie obiektowe, ale czy czasem nie trzeba starać się rozdrabniać wszystkiego ? Np. nie musiałem też robić klasy button, tylko bezpośrednio wyświetlać to w klasie MenuScreen. Tak samo napisałeś że nie muszę robić tego wczytywania w FileManager, tylko bezpośrednio przez konstruktor, co jest jednak fajnym pomysłem, jednak nie wiem czy tak się to powinno robić. Tak więc mam wybrać metodę setterów czy konstruktora ?

0

Jakiego pracownika wolisz:

  • któremu wystarczy powiedzieć, tu masz adres idź pomaluj mieszkanie.
  • którego trzeba pod wskazany adres dostarczyć, włożyć do rąk pędzel a podczas malowania cały czas tą pędzel maczać do farby.
    ?

Jak odpowiesz na to pytanie to masz gotową odpowiedź na swoje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1