Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] classe astratta non instanziabile?

    ho un errore del genere:

    file1.h:705: warning: 'virtual nsresult AAA::funzione(void**)' was hidden
    file2.h:212: warning: by 'virtual nsresult BBB::funzione(PRUint32*)'

    file.cpp: In member function 'virtual nsresult CCC::metodo(AAA*&)':
    file.cpp:189: error: cannot allocate an object of abstract type 'BBB'
    file2.h:66: note: because the following virtual functions are pure within 'BBB':
    file1.h:705: note: virtual nsresult AAA::funzione(void**)

    come posso risolverlo? mi riporto qui sotto i file sorgenti e le corrispondenze

    file1.h:705
    file2.h:212
    file.cpp

    AAA = nsIRenderingContext
    BBB = nsRenderingContextQt
    CCC = nsDeviceContextQt
    funzione = RetrieveCurrentNativeGraphicData
    metodo = CreateRenderingContext

    grazie!

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Le classi astratte(classi con almeno una funzione virtuale pura) non si possono istanziare.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  3. #3
    sì, lo so

    la domanda è: come rendere la classe istanziabile?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Derivando da essa e risolvendo la funzione, ovviamente e occhio agli warning. La funzione deve avere lo stesso prototipo.

  5. #5
    non è un problema che mi porto dietro dai primi due warning?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In genere gli stessi warning si avrebbero anche in caso di classe non virtuale pura, se i protopiti delle funzioni virtuali non sono gli stessi.

    In questo caso se non ho capito male,

    virtual nsresult AAA::funzione(void**) è astratta e tu cerchi di specializzarla con
    virtual nsresult BBB::funzione(PRUint32*)

    Dal momento che i due prototipi sono diversi, per il compilatore sono due funzioni diverse e quindi la funzione di AAA rimane astratta impedendo l'istanziazione della class BBB.

    Nei file che hai postato comunque, le derivazioni delle classi sono diverse.
    Così a occhio direi che BBB sia un proxy per AAA

  7. #7
    ti spiego il contesto: è il sorgente di firefox
    praticamente usa un toolkit grafico "astratto" che viene concretizzato usando librerie vere (QT, GTK, ecc)
    il tutto permette di implementare l'interfaccia grafica in 10k righe di codice (su 2 milioni di righe totali)

    in pratica: QT (nsRenderingContext, file2) estende il toolkit base di mozilla (nsIRendering, file1)
    ma non funziona

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si, ho spluciato un pò.
    Solo che qui:
    http://lxr.mozilla.org/mozilla1.8/so...xtGTK.cpp#1393

    il parametro è void**

    e solo nella QTimpl è ridefinito il parametro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.