Problem z prawidłowym tworzeniem obiektu z klasy potomnej
Ostatnio zmodyfikowano 2012-02-27 17:17
jsc Temat założony przez niniejszego użytkownika |
Problem z prawidłowym tworzeniem obiektu z klasy potomnej » 2012-02-16 23:52:19 Postanowiłem zrobić klasę potomną klasy GtkWidget, aby móc ja wykorzystywać jako forma do specjalistycznych widgetów i zrobiłem coś takiego: okno.hpp #ifndef OKNO_HPP #define OKNO_HPP class okno { private: public: okno() { gtk_window_new( GTK_WINDOW_TOPLEVEL ); } }; #endif
main.cpp #include <gtk/gtk.h>
int main( int argc, char * argv[] ) { gtk_init( & argc, & argv ); GtkWidget okno; gtk_widget_show( okno ); gtk_main(); return 0; }
, ale przy kompilacji wyskakuje mi: main.cpp:9:25: error: cannot convert 'GtkWidget {aka _GtkWidget}' to 'GtkWidget* {aka _GtkWidget*}' for argument '1' to 'void gtk_widget_show(GtkWidget*)'
Wie ktoś jak ominąć ten problem. |
|
DejaVu |
» 2012-02-17 00:27:28 gtk_widget_show( & okno );
|
|
jsc Temat założony przez niniejszego użytkownika |
» 2012-02-17 00:43:05 Na początku przeproszę, bo źle wkleiłem (teraz wklejam dobre po zaproponowanej poprawce: okno.hpp #ifndef OKNO_HPP #define OKNO_HPP class okno : public GtkWidget { private: public: okno() { gtk_window_new( GTK_WINDOW_TOPLEVEL ); } }; #endif
main.cpp #include <gtk/gtk.h> #include "okno.hpp"
int main( int argc, char * argv[] ) { gtk_init( & argc, & argv ); okno co; gtk_widget_show( & co ); gtk_main(); return 0; } Teraz się kompiluje, ale program się wywala. |
|
DejaVu |
» 2012-02-17 11:14:24 No to być może funkcja gtk_widget_show przejmuje na własność obiekt przekazany poprzez argument i musisz go wówczas zaalokować dynamicznie, tj. użyć operatora new . |
|
jsc Temat założony przez niniejszego użytkownika |
» 2012-02-17 14:33:25 Rozwiązanie jest zupełnie inne: Moje założenie, że jak klasa dziedziczy to można ją utworzyć przez zwykłe wywołanie konstruktora klasy macierzystej, czyli że kod: gtk_window_new( GTK_WINDOW_TOPLEVEL );
można przetłumaczyć na kod: this = gtk_window_new( GTK_WINDOW_TOPLEVEL );
, ale tak nie jest. Więc zawarłem w klasie okno wskaźnik na obiekt klasy GtkWidget i operacje tworzenia okna i jego wyświetlanie skierowałem na ten wskaźnik i całość umieściłem w konstruktorze klasy |
|
jsc Temat założony przez niniejszego użytkownika |
» 2012-02-20 23:23:07 Teraz potrzebuje sposobu przemycenia sygnału z tego obiektu potomnego do funkcji gtk_init (). |
|
jsc Temat założony przez niniejszego użytkownika |
» 2012-02-27 17:17:05 Jako protezę zrobiłem taki myk (można to zamknąć w pojedynczej funkcji o parametrach klasy GtkWidget i mojej Klasy): Tworzę osobno obiekt widgetu i mojej klasy. Przekazuję widget do konstruktora mojej klasy przez wskaźnik. Ustawieniami widgetu manipuluję za pośrednictwem obiektu mojej klasy, a jego samego wystawiam na pastwę zdarzeń.
Tylko, że to na pewno zła praktyka ponieważ: - tworzy 2 punkty dostępu do tego samego obiekty - niszczenia obiektu (dla uniknięcia wycieków pamięci) mojej klasy jeszcze nie implementowałem, ale się domyślam, że będzie skomplikowane i rozłożone na 2 funkcje, które znajdą się w innych modułach (moja klasa i nagłówek sterowania np. programem). |
|
« 1 » |