2013-06-07 20 views
12

Oto mój przykładowy kod:Inaccessible konwersji w QObject

class hoho : public QObject 
{ 
    Q_OBJECT 
public: 
    hoho() 
    { 
     httpFetch = new HttpFetch(QUrl("http://www.google.com/")); 
     connect(httpFetch, SIGNAL(Fetched()), this, SLOT(PrintData(QByteArray))); 
    } 

    void PrintData(QByteArray http) 
    { 
     qDebug()<<http; 
    } 

    HttpFetch *httpFetch; 
}; 

Kiedy próbuję skompilować ten, po błędzie wyskakuje

1>main.cpp(15): error C2243: 'type cast' : conversion from 'HttpFetch *' to 'const QObject *' exists, but is inaccessible 

Ten błąd jest jako klasa pochodzi od QObject (co jest niezbędny dla mechanizmu sygnału i szczeliny).

Czy ktoś może mi powiedzieć, jak to naprawić?

+0

Twój konstruktor nie jest poprawny, przynajmniej dlatego, że podłączyłeś lokalny obiekt 'httpFetch' (który zostanie zniszczony na końcu zakresu ctor) do' this'. Nie jestem pewien, ale może to być źródło tego komunikatu o błędzie. Jeśli nie, cóż, nadal będziesz mieć problem i nie będziesz mieć połączenia, gdy tylko wykonanie zakończy zakres kontrolny. Wygląda na to, że powinieneś raczej zainicjować zmienną składową ... W tej chwili lokalny 'httpFetch' ukrywa zmienną składową' httpFetch'. – JBL

+0

Próbowałem, jak powiedziałeś. Ale błąd pozostaje taki sam. – Bhai

+0

Cóż, obecnie kod ctor jest nieprawidłowy. Najlepszy przypadek, nie będzie związku po zakończeniu ctor, w najgorszym przypadku masz UB, ponieważ wskaźnik, który trzyma połączenie dla sygnału jest śmieci. – JBL

Odpowiedz

39

Prawdopodobnie użytkownik nie wywodził publicznie HttpFetch, ale prywatnie z QObject. Tak po prostu zmienić

class HttpFetch : QObject { // ... 

do

class HttpFetch : public QObject { // ... 

i powinno działać.

0

Czy zapomniałeś makra Q_OBJECT w klasie HttpFetch?

Czy mogę zobaczyć Twoją klasę HttpFetch?

+0

Makro Q_OBJECT było tam, ale QObject został uzyskany prywatnie. Teraz problem został rozwiązany. – Bhai

1

Jeśli twój projekt wymaga uczynienia dziedziczenia niepublicznym (miałem to wymaganie, ponieważ odziedziczyłem po QWidget w celu wielowątkowości i nie chciałem ujawnić wszystkich funkcji użytkownikowi), możesz to zrobić:

class FilesQueueQList : protected QWidget 
{ 
    Q_OBJECT 

public: 
    using QWidget::QObject; //This is the solution! 
//... 
} 

Teraz członkowie QWidget są prywatni/chronieni, ale QObject jest dostępny jako publiczny.

Powiązane problemy