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

    [C++] error:invalid use of incomplete type 'class mini_graphics::Polygon'

    Salve a tutti,
    sto provando a fare un progettino in c++, preso da internet, con eclipse su ubuntu 9.4 che ha un file header shapeinterface.h nel quale ci sono una classe astratta shape con varie funzioni virtuali, ereditate da due classi sempre virtuali polygon e regular, poi finalmente ridefinite nelle classi concrete dot, line, triangle...
    non so perchè il compilatore mi da degli errori relativi alla classe polygon, come se non fosse ben dichiarata.
    vi posto il codice in breve (parti salienti):

    file shapeinterface.h:
    codice:
    #include<iostream>
    using namespace std; //questo me lo fa mettere per forza perchè altrimenti non mi prende
                                  //l'overloading degli operatori << e >>; ma io volevo usare un namespace
                                 //diverso, infatti sotto l'ho definito:
    
    namespace mini_graphics {
       struct Point {....}; //struttura Point che mi rappresenta i punti del piano
       struct Shape_Error {....}; //gestione delle eccezioni con costrutti throw
    
       ostream& operator<<(ostream& out, const Point& p);  //overloading perchè funzionino con i
       istream& operator>>(istream& inp, Point& p);             //Punti del piano
    
    class Shape{
    public:
       ....
       .... //varie funzioni virtuali tutte inizializzate a zero
    };
    
    class Polygon:virtual public Shape {   //QUI C'è L'ERRORE: FORWARD DECLARATION OF 'CLASS MINI_GRAPHICS::POLYGON 
    protected:
       ....
    public:
      .... //ridefinizione delle funzioni virtuali necessarie
    
    };
    
    class Dot:public Polygon {ERRORE:invalid use of incomplete type 'class mini_graphics::Polygon';
    public:
        using Polygon::set;   //QUI ALTRO ERRORE, ripetuto in tutte le classi successive derivate (line, triangle...):type 'mini_graphics::Polygon' is not a base type for type 'mini_graphics::Polygon::Dot
    
    
        Dot();
        ....
        ....
    };
    quindi in sostanza gli errori sono
    1)invalid use of incomplete type 'class mini_graphics::Polygon';
    2)forward declaration of 'class mini_graphics::Polygon';
    3)type 'mini_graphics::Polygon' is not a base type for type 'mini_graphics::Polygon:ot'.
    Perchè? mi sembra di averla definita bene la classe polygon, è come se non mi accettasse l'ereditarietà, non capisco.
    Scusate se è un errore da newbie ma sto preparando da sola l'esame in c++ perchè il simpatico profe veniva a lezione a leggerci le dias, :berto: cosa totalmente inutile visto che posso farlo da sola.
    Grazie in anticipo per l'attenzione
    Gioia

  2. #2
    no ideas??

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Difficile dare una risposta senza qualcosa di compilabile. A me sembra che la sequenza di dichiarazione delle classi sia corretta, a eccezione delle spaziatura (e seguenti):
    codice:
    class Polygon:virtual public Shape
    che dovrebbe essere:
    codice:
    class Polygon : virtual public Shape
    Immagino sia un problema di copia incolla comunque.
    Può darsi che riportartando le parti dove incontri il problema, hai corretto per caso l'errore. A volte basta poco, un ; o una } mancanti sono più che sufficenti per impazzire.
    Se hai scaricato il codice da internet, posta il link oppure posta qualcosa di compilabile.

    Per quanto riguarda il namespace, basta prefissare istream e ostream con std::
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    grazie per la risposta! Ho provato a prefissarlo con std::, insomma mi sembrava ovvio, se usare "using namespace std;" mi risparmia tutto gli std da prefissare, basta metterci std::cout e me lo riconosce! invece no, purtroppo, evidentemente al compilatore gli sto proprio antipatica. non so per quale motivo non me lo riconosce con l'operatore di risoluzione. MAH!
    il link del progetto è
    http://www.bo.cnr.it/corsi-di-inform.../ShapeInterf.h
    http://www.bo.cnr.it/corsi-di-inform...hapeImplem.cpp
    http://www.bo.cnr.it/corsi-di-inform.../Shape_using.h
    http://www.bo.cnr.it/corsi-di-inform...Shape_main.cpp

    fondamentalmente ho ricopiato per cercare di capire come mettere in pratica quello che imparo in teoria, ma il compilatore non aiuta....può essere necessario aggiornare i componenti di eclipse o di gcc? perchè sul portatile al momento non ho internet, quindi ho scaricato i pacchetti dal fisso e messi sul portatile....mi sembrano gli ultimi ma, chissà, un si capisce miha nulla!

    grazie mille comunque
    Gioia

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ti riporto solo le modifiche (poche) che mi hanno permesso di compilare senza problemi.
    In shapeinf.h
    codice:
    #ifndef SHAPE_INT__
    #define SHAPE_INT__
    #include <iosfwd> // header standard
    namespace mini_graphics
    {
            ...
    
    	std::ostream& operator<<(std::ostream&, const Point&);
    	std::istream& operator>>(std::istream&, Point&);
    
            ... 
    }
    #endif
    In shapeimpl.cpp
    codice:
    #include <iostream> // questi sono gli header standard
    #include <cstdio>
    #include <cmath>
    #include "ShapeInterf.h"
    using namespace std;
    A questo punto penso sia un problema di configurazione del compilatore. Appena puoi installalo o aggiornalo dal repository.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    ora provo con le modifiche consigliate. e quando avrò internet (tra unasettimana piu o meno) aggiornerò il tutto, magari ti chiedo una mano perchè davvero ubuntu per me è un pò piu indecifrabile di windows
    grazie mille ancora.
    Gioia

  7. #7
    mah, ora magicamente ho copiaincollato il codice su un nuovo progetto e funziona. io proprio non capisco!
    misteri....
    grazie!!

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.