[QT] dwie klasy, błąd


(radmar) #1

witam

mam nowy problem:

mam dwie klasy:

MainWindow

oraz

MyClass

w MyClass.h

do sekcji private wrzucam:

Phonon::MediaObject *mediaObject;

natomiast do konstruktora tej klasy w MyClass.cpp

MyClass::MyClass()

{

mediaObject = new Phonon::MediaObject(this);

}

i otrzymuję błąd:

error: no matching function for call to 'Phonon::MediaObject::MediaObject(Radio* const)'

P.S Dodam tylko, że jak te instrukcje umieszczę w klasie MainWindow(odpowiednio w klasie i konstruktorze) to błędu nie ma

proszę o pomoc


(Sawyer47) #2

MyClass dziedziczy po QObject? Masz makro Q_OBJECT?


(radmar) #3

wielkie dzięki działa, fakt zapomniałem o QObject, mam te nawyki z QT Jambi

wstawiłem makro, oraz odziedziczyłem po QObject

mam teraz pytanie bardziej teoretycznie:

jak w C++ to wygląda:

mam konstruktora przydzielam pamięć

potem ją zwalniam w destruktorze za pomocą delete nazwa obiektu?

jak mam zwolnić pamięć po składowej klasy np. typu int? - a może po składowych pamięci się nie zwalnia?

oraz

pytanie odnośnie klasy MainWindow, jak wstawię kontrolki designerem - również mam dbać o sprzątanie po tych kontrolkach?


(Sawyer47) #4

Taki błąd już miałeś w poprzednim temacie.


(radmar) #5

wiem, juz naprawione, wykonałem edit posta

spojrz


(Sawyer47) #6

Jeśli alokujesz dynamicznie new to i zwalniasz delete. Składowe niealokowane dynamicznie (np. int) są zwalniane automatycznie wraz z obiektem.

Zbyt ogólne pytanie, przynajmniej jak dla mnie. Tak czy siak, patrz wyżej.


(radmar) #7

mam jeszcze dwa pytania:

1.destruktor klasy MyClass sam się wywoła, prawda?

  1. jest taka biblioteka pod Jave (Xstream) ona umożliwia zapis obiektu( tablicy, czy nawet obiektu własnej klasy do pliku XML,

potem za pomocą tej biblioteki możemy ją odczytać - przywracamt zapisany stan obiektu) w tym miejscu rodzi się pytanie: czy w QT jest taki mechanizm, jesli tak to jaka klasa?

oraz czy istnieją inne takie biblioteki coś jak xsrteam, tylko żeby była tez pod C/C++


(Sawyer47) #8
  1. Tak, destruktor w C++ jest deterministyczny, jest wywoływany automatycznie po wyjściu zasięgu dla zmiennej autmatycznej / delete dla dynamicznie alokowanej (w uproszczeniu)

  2. Zupełnie automatycznych, tzn niewymagających interwencji w kod, w pełnie automatycznych raczej nie ma. Natomiast co do Qt to dużo typów ma przeładowane operatory we/wy, ale nie do XML.


(radmar) #9

mam kolejny błąd:

mainwindow.cpp:17: error: no match for 'operator=' in '((MainWindow*)this)->MainWindow::object = (operator new(8u), (, ((Radio*))))'

dzieje się tak gdy:

w klasie MainWindow, sekcja private - Myclass object; // to działa

teraz w konstruktorze tej klasy przydzielam pamięć: object = new MyClass();

konstruktora klasy MyClass, ma taką postać:

MyClass()

{

...... // tutaj rozne instrukcje

}


(Sawyer47) #10

Daj więcej kodu, trudno wróżyć z tych ochłapów. Być może przypisujesz do object tam gdzie nie możesz (bo jest private), być może chodzi o co innego.


(radmar) #11

problem rozwiązany. zapomniałem object zadeklarowac jako wskaznik

-- Dodane 27.07.2010 (Wt) 19:00 --

mam natomiast inny problem - szukam w dokumentacji i nie mogę znaleźć - nigdzie nie widze co mogę robić źle.

Phonon::MediaObject *mediaObject; // sekcja private klasy MainWindow

jak teraz robię tak w konstruktorze klasy MainWindow:

mediaObject = new Phonon::MediaObject(this);

QString fileName("dysk\plik.ogg");

mediaObject->setCurrentSource(fileName);

mediaObject->play();

jednak nic sie nie dzieje - nie gra muzyka, w czym może byc blad?