Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]modello ad oggetti e classi

    Ciao.
    Devo costruire un modello ad oggetti che descrive un file per importarlo.
    Sto creando le classi di cui è composto questo modello , ma ho un problema:
    Se la classe scritta prima ha un riferimento alla classe scritta dopo non riesco a compilare:

    codice:
    class CIfcProject :
    	public CBaseEntityIfc
    {
    public:
    	CIfcProject(void);
    	virtual ~CIfcProject(void);
    	CIfcOwnerHistory IfcOwnerHistory;
    	
    protected:
    	
    private:
    };
    
    class CIfcOwnerHistory :
    	public CBaseEntityIfc
    {
    public:
    	CIfcOwnerHistory(void);
    	virtual ~CIfcOwnerHistory(void);
    protected:
    private:
    };
    ottengo quest errore:
    c:\IFC\SAX\SAXIntro\IFCClasses.h(32) : error C2079: 'CIfcProject::IfcOwnerHistory' uses undefined class 'CIfcOwnerHistory'

    SO che basta invertire l'ordine di scrittura delle classi, ma sono agli inizi del progetto , enon vorrei ci fossero riferimenti incrociati o incasinamenti , esiste un buon modo per evitare questi errori?
    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Usa il forward reference.
    In pratica questo:
    codice:
    // forward reference
    class CIfcOwnerHistory;
    class CQualcosaltro;
    class CQualcosaltroancora;
    
    // Dichiarazioni
    class CIfcOwnerHistory {
       ...
    };
    
    class CQualcosaltro {
       ...
    };
    
    class CQualcosaltroancora {
       ...
    };
    Tutti le funzioni membro andranno nei file cpp.
    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.

  3. #3
    il membro CIfcOwnerHistory IfcOwnerHistory di CIfcProject, non è un riferimento, ma un istanza della classe CIfcOwnerHistory, dunque necessita la dichiarazione completa dalla classe CIfcOwnerHistory.
    I soldoni, metti la dichiarazione della classe CIfcOwnerHistory in un header dedicato (ad esempio in UIfcOwnerHistory.h protetto al suo interno da inclusioni multiple ricorsive con il solito ifndef trick ) ed includilo dove ne abbisogni.

    ad esempio:
    codice:
    #include "UIfcOwnerHistory.h"
    
    class CIfcProject :
    	public CBaseEntityIfc
    {
    public:
    	CIfcProject(void);
    	virtual ~CIfcProject(void);
    	CIfcOwnerHistory IfcOwnerHistory; // istanza: quindi necessita della dichiarazione di CIfcOwnerHistory;
    	
    protected:
    	
    private:
    };
    Se anziché un'istanza fosse stato un riferimento od un puntatore, allora ti bastava premettere una forward declaration:

    ad esempio:
    codice:
    class CIfcOwnerHistory; // forward declaration
    class CIfcProject :
    	public CBaseEntityIfc
    {
    public:
    	CIfcProject(void);
    	virtual ~CIfcProject(void);
    	CIfcOwnerHistory &IfcOwnerHistory; //riferimento: quindi gli basta la forward declaration di cui sopra;
    	CIfcOwnerHistory *IfcOwnerHistoryPtr; //puntatore: quindi gli basta la forward declaration di cui sopra;
    	
    protected:
    	
    private:
    };

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 © 2025 vBulletin Solutions, Inc. All rights reserved.