Witam.
Przejdę od razu do rzeczy. Napisałem GUI do programu z użyciem wxWidgets. Stworzyłem klasę okna, w której mam kontroli, menu itp. Wygląda ona mniej więcej tak:
class mainWindow
: public wxFrame
{
public:
mainWindow( const wxString & title );
void onQuit( wxCommandEvent & WXUNUSED( event ) );
bool performControls();
bool performMenuBar();
private:
wxButton * bAddAddress;
wxComboBox * cbCategories;
wxMenu * mFile;
wxMenu * mAddress;
};
Jak polecił mi (bodajże) kiedyś Pan Piotr, napisałem również klasę
myWindow.
class myWindow
{
public:
myWindow();
~myWindow();
bool run();
private:
mainWindow * application;
};
W tej klasie prócz GUI (czyli obiektu typu
mainWindow) chcę umieścić obiekt klasy
datebase, która zajmuje się danymi.
Dlaczego tak? Głowna klasa okna, czyli
mainWindow z danymi nie ma
nic wspólnego. Stworzyłem więc osobną klasę, która łączy jakby te dwa problemy (GUI i dane).
Przedstawię schematycznie, jak wygląda klasa
database.
class dataA
{
public:
void setFoo( int newFoo );
private:
int foo;
};
class dataB
{
public:
void setSex( int newSex );
private:
int sex;
};
class database
{
public:
...
private:
std::vector < dataA > A;
std::vector < dataB > B;
};
Nie wiem, czy może już ktoś widzi jaki mam problem? :)
Dla tych, który się nie domyślają:
W klasie
myWindow utworzę obiekt klasy
database. Następnie zainicjuję go i prześlę (jak argument) do klasy okna. Będzie to wyglądało mniej więcej tak:
database * myBase = new database;
myBase->readA();
myBase->readB();
myWindow * application = new myWindow( & myBase );
application->run();
Nareszcie. Problem polega na tym, że nie chcę mieć publicznych pól w klasie
database, a co za tym idzie? W klasie
myWindow nie będę mógł dobrać się do (std::vector) dateA oraz dateB. Przykładowo:
bool myWindow::run()
{
base->dateA[ 0 ].setFoo( 69 );
base->dateB[ 7 ].setSex( 777 );
}
Tu moje pytanie:
Jak poprawnie i zgodnie ze standardem rozwiązać ten problem?.
Myślałem o tym, aby w zrobić "metody na metody", czyli napisać (w klasie
database) metodę, która wywoływałaby metodę (czyżbym nadużywał jakiegoś słowa? ;p) klasy
dateA lub
dateB. Jednak to rozwiązanie mnie nie zadowala... W sumie musiałbym mieć około 16 metod. A co jeżeli był rozszerzył program do pięciu klas? 60 "metod na metody"?
Dziedziczenie też odpada.
Liczę na Was :).