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

Konstruktor obiektu pochodnego w obiekcie bazowym (Qt)

Ostatnio zmodyfikowano 2013-10-22 17:15
Autor Wiadomość
b00rt00s
» 2013-10-18 22:06:00
Dodam tylko, że zamiast nullptr, użyłem this
Wg. mnie ze względu na przejrzystość kodu nie powinieneś. Tak stworzony obiekt nie musi być niszczony przez rodzica, więc nie ma potrzeby aby go podawać (w tym przypadku rodzicem jest właśnie this). W tym przypadku nie ma prawie różnicy co zrobisz, ale gdyby obiekt był przechowywany przez inteligentny wskaźnik, a rodzic zniszczyłby obiekt jako pierwszy, to doprowadziłbyś do crashu programu.

A co do Twoich przemyśleń o tworzeniu obiektów z użyciem operatora new. Tak tworzy się obiekty na stercie, a nie na stosie. Ma to wiele konsekwencji,  ale najważniejsze to:
a) potrzeba zadbania o zniszczenie obiektu, inaczej dojdzie do wycieku pamięci. Obiekty tworzone na stosie niszczone są automatycznie, gdy sterowanie wyjdzie z zasięgu. W przypadku biblioteki Qt i gdy obiekt ma rodzica, obiekt rodzic niszczy obiekt dziecka i nie powinno się ręcznie wywoływać
delete nazwa_wskaznika
, bo jak już pisałem możesz doprowadzić do crashu aplikacji.
b) spora elastyczność, szczególnie, gdy używamy tzw. inteligentnych wskaźników
c) podobno zmniejszenie wydajności (niech m,nie ktoś poprawi, jeśli się mylę).
P-93982
CodeFun
Temat założony przez niniejszego użytkownika
» 2013-10-19 09:47:09
Z tym operatorem new już rozumiem, w czym rzecz, dziękuję :)

Inteligentne wskaźniki ? Masz na myśli te, które powstają za pomocą funkcji wirtualnych ? Czy jest jeszcze jakiś typ wskaźnika o którym nie wiem, albo typ, który Qt ma wbudowany ?
P-93995
kubawal
» 2013-10-19 09:53:17
auto_ptr w <memory>
P-93996
pekfos
» 2013-10-19 15:16:03
auto_ptr w <memory>
std::auto_ptr<> jest zdeprecjonowane. Jeśli się ma kompilator wspierający nowy standard, powinno się używać std::unique_ptr<>.
P-94019
CodeFun
Temat założony przez niniejszego użytkownika
» 2013-10-20 09:48:57
Dziękuje Panowie za odpowiedzi rozeznam temat. Prosze moderatorów o nie zamykanie tematu, gdyż może mi się jeszcze przytrafić pytanie odnośnie konstruktorów. Jestem obecnie na przedzieraniu się w programie przez dziedziczenie i przyjaźń także...

Proszę tylko o odpowiedź, jak umieszczać w poście problematyczny kod w charakterystycznych polach oraz cytaty. Szukałem po forum, ale nie znalazłem tych funkcji :( Tak jak mówię próbowałem: 
ale nie zadziałało. Polu edycyjnym też nie widzę, żadnych sugestii, ani opcji.
P-94095
xevuel
» 2013-10-20 11:18:47
Proszę tylko o odpowiedź, jak umieszczać w poście problematyczny kod w charakterystycznych polach oraz cytaty.
Zielona ramka pod "Załóż nowy temat"...

Prosze moderatorów o nie zamykanie tematu, gdyż może mi się jeszcze przytrafić pytanie odnośnie konstruktorów.
Autor tematu może go otworzyć. A jeśli to pytanie nie będzie związane z tym tematem, załóż nowy.
P-94099
CodeFun
Temat założony przez niniejszego użytkownika
» 2013-10-22 17:15:26
No i trafił mi się problem z konstruktorem klasy pochodnej. Siedzę już nad nim parę godzin, a pewnie rozwiązanie jest śmiesznie banalne... O co chodzi:
Tworze sobie w Qt okno QMainWindow w tym oknie mam parę przycisków, menubar itd. Do tego chcę, umieścić w QMainWindow tablice z klasy QTableWidget. Z Racji tego, że przewiduje, dosyć rozbudowane działanie na tej tablic (własne metody typu : dodaj pozycje, usuń, edytuj itd) stworzyłem osobną klasę, która dziedziczy po QTableWidget

C/C++
class tablica
    : public QTableWidget
{
    Q_OBJECT
public:
    tablica();
    ~tablica();
   
    void dodajdor();
    void usundor();
    void edytujdor();
   
    signals:
   
public slots:
   
};

udało mi się stworzyć obiekt w main() poprzez jawne wywołanie typu
C/C++
tablica nowatablica;
nowatablica.show();

jednak gdy zamierzam stworzyć obiekt w klasie głównego okna dziedziczącej po QMainWindow w sposób dynamiczny tzn:
w pliku
oknogl.h

tablica * nowatablica;

to wyskakuje bład

nowatablica does not name a type

co to znaczy to wiem, ale nie potrafię z tym dojść co nie tak.

Dodatkowo mam problem z tym, aby nowo stworzony obiekt typu tablica wyświetlić w oknie rodzica QMainWindow.

Definicje konstruktora w klasie tablica typu

tablica(); // konstruktor domniemany ponieważ tablica jest pochodną
w pliku tablica.cpp definiuje konstruktor z lista inicjalizacyjna  na której:
tablica::tablica():QObject(parent)

po tym rozpisaniu mojego problemu reasumując:
-chce stworzyć osobną klasę tablica (udało się)
-chcę aby można był stworzyć obiekt klasy tablica dynamiczne w klasie okna głównego dziedziczącego po QMainWindol (powyższy bład does not...)
-chce, aby stworzona tablica była dzieckiem QMainWindow, a nie żyła osobno jak to dzieje się teraz po jawnym wywołaniu w main();

ps. Panie moderatorze, przykro mi, ale nie widzę pod oknem edytowym, żadnych dodatkowych opcji, które pozwoliły by mi na umieszczanie kodu w odpowiednim polu.

Zielona ramka pod "Załóż nowy temat"... Przy edytowaniu posta nie ma. - xevuel

EDIT: Rozgryzłem to. Po prostu łyk kawy i chyba głaskanie kota.

W pierwszym wypadku należy zdeklarować nazwę klasy w pliku nagłówkowym okna głównego czyli poporstu
class tablica;

W drugim wypadku, aby moja tablica z klasy tablica była dzieckiem okna dziedziczącego z QMainWindol deklaracja konstruktora powinna wyglądać tak:
tablica( QWidget * parent = 0 );
a definicja tak:
C/C++
tablica::tablica( QWidget * parent )
    : QTableWidget( parent )

amen.
P-94320
1 « 2 »
Poprzednia strona Strona 2 z 2