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

Problem z prawidłowym tworzeniem obiektu z klasy potomnej

Ostatnio zmodyfikowano 2012-02-27 17:17
Autor Wiadomość
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
C/C++
#ifndef OKNO_HPP
#define OKNO_HPP
class okno
{
private:
   
public:
    okno()
    {
        gtk_window_new( GTK_WINDOW_TOPLEVEL );
    }
   
};
#endif /* OKNO_HPP */

main.cpp
C/C++
#include <gtk/gtk.h>

int main( int argc, char * argv[] )
{
    gtk_init( & argc, & argv ); //Inicjacja zgodna z wejsciem programu
   
    GtkWidget okno;
   
    gtk_widget_show( okno );
   
    gtk_main(); //Uruchomienie glownej petli GTK+
    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.
P-50874
DejaVu
» 2012-02-17 00:27:28
C/C++
gtk_widget_show( & okno );
P-50875
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
C/C++
#ifndef OKNO_HPP
#define OKNO_HPP
class okno
    : public GtkWidget
{
private:
   
public:
    okno()
    {
        gtk_window_new( GTK_WINDOW_TOPLEVEL );
    }
   
};
#endif /* OKNO_HPP */

main.cpp
C/C++
#include <gtk/gtk.h>
#include "okno.hpp"

int main( int argc, char * argv[] )
{
    gtk_init( & argc, & argv ); //Inicjacja zgodna z wejsciem programu
   
    okno co;
   
    gtk_widget_show( & co );
   
    gtk_main(); //Uruchomienie glownej petli GTK+
    return 0;
}
Teraz się kompiluje, ale program się wywala.
P-50876
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
.
P-50881
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:
C/C++
gtk_window_new( GTK_WINDOW_TOPLEVEL );

można przetłumaczyć na kod:
C/C++
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
P-50885
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 ().
P-51156
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).
P-51514
« 1 »
  Strona 1 z 1