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

    [c++]include e idioma pimpl

    ciao.
    ho aperto questo nuovo post per cercare di chiarirmi le idee sull'idioma pimpl e su come definire le dipendenze #include.

    1)esiste un metodo preciso per creare le dipendenze di un gruppo di files da includere per evitare riferimenti circolari,include multipli e casini vari?
    2)ho visto l'alternativa al pragma once con i define , è meglio utilizzre quella?è portabile su unix ?
    3)non riesco a capire il pipl , sono un po duro di comprendonio.

    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    1) In genere per evitare riferimenti circolari si usano forward reference (spesso dei puntatori), avendo poi l'accortezza di definire le varie funzioni solo dopo che tutti i tipi sono dati definiti.
    Dovresti essere più specifico se hai un problema di questo tipo.

    2) #pragma once è adottata solo da VC++ e dal nuovo Borland (a quanto ho letto). La via standard rimane di usare i vari define con le guardie di inclusione.

    3) http://en.wikipedia.org/wiki/Opaque_pointer
    Anche qui dovresti essere più specifico su quali dubbi hai. L'argomento è troppo per essere affrontato in poche righe.
    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
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie shodan.
    Sto studiando il pattern model/view/presenter , e ho creato un modello per prova:

    classe presenter:

    codice:
    //.cpp
    #pragma once
    #include "Presenter.h"
    class cpresenter
    {...}
    
    //.h
    #pragma once
    #include <vector>
    #include "model.h" //includo gli header di model 
    #include "DynamicTextures.h";//e view nel presenter
    using namespace std;
    classe Model:
    codice:
    //.cpp
    #pragma once
    #include "Model.h"
    
    //.h
    #pragma once
    
    #include <cv.h>
    #include <highgui.h>
    #include "ARToolKitPlus/TrackerSingleMarkerImpl.h"
    #include "ARToolKitPlus/ar.h"
    #include <stdio.h>
    #include <string.h>
    #include <glut.h>
    
    class CModel
    {...}
    classe view DynamicTextures.
    codice:
    //.cpp
    
    #include "DynamicTextures.h"//che è la classe view
    
    //.h
    #include presenter.h//per creare oggetto membro presenteer
    .
    .
    .
    private:
       cpresenter m_presenter;//dichiaro il presenter come variabile membro di classe
    i problemi che mi da sono errri di linker dove dice che la funzione è gia implementata in un altra class .obj

    il presenter da quello che ho capito lo posso implementare come ponte tra view e model, quindi ho incluso i riferimenti a queste due classi in esso.
    Il problema con cui mi scontro è che la view è una classe di applicazione con variabili publiche su cui ho pensato posso settare il viewdata dal presenter .
    poi questa view include a sua volta il presenter , e questo penso sia uno sbaglio.

    Dovrei creare una classe con le entità model , presenter e view separate ed incapsulate in essa?
    una classe contenitore?

    grazie

    se no?

    Grazie.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Nel Presenter.h definisci delle funzioni? E si, come le definisci?
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    questo è il mio cpresenter :
    codice:
    #pragma once
    #include "Presenter.h"
    
    CPresenter::CPresenter()
    {
    }
    
    CPresenter::CPresenter( DynamicTextures*  pView )
    {
    	m_view = pView;
    	m_pModel = new CModel();
    }
    
    CPresenter::~CPresenter(void)
    {
    }
    	
    bool CPresenter::InitCV()
    {
    	
    	return true;
    }	
    
    bool CPresenter::GetTextureFromCam()
    {
    	CTexture texture =m_pModel->GetTextureFromCam()
    	m_view->UpdateTexture(texture.rawdata);
            return true;
    }
    
    vector<double>* CPresenter::GetListInsertMarkers()
    {
    
    	return NULL;
    }
    
    vector<double>* CPresenter::GetListDeleteMarkers()
    {
    
    	return NULL;
    }
    e nella view ho questa funzione pubblica:
    codice:
    void DynamicTextures::UpdateTexture (unsigned char* pGrabScreen)
    {
        const Image* pkImage = m_spkDTexture->GetImage();
        const unsigned char *aucSrc = pkImage->GetData();
        unsigned char* aucTrg = (unsigned char*)
            m_pkRenderer->Lock(m_spkDTexture, Renderer::DT_WRITE);
    
    	aucTrg = pGrabScreen;
       
        m_pkRenderer->Unlock(m_spkDTexture);
    }

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non mi sembra il Presenter.h questo.
    E non mi sembra nemmeno attinente all'idioma pimpl.
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    infatti , shodan , l'ho implementato senza sapre, perchè non ho trovato un link con il codice di come si implementa in c++.
    Puoi aiutarmi?
    ciao.

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Un esempio di pimpl per CPresenter può essere questo, visto che ci sono vari modi di implementarlo. La cosa interessante è che si può cambiare la struttura pimpl senza che il mondo esterno lo sappia.
    Puoi far derivare la pimpl da altre classi, renderla una classe base, aggiungerci un reference counter, sostituirla al volo con un'altra implementazione di pimpl (come fa il pattern state se non ricordo male), ma il tuo programma vedrà solo quanto hai definito in Presenter.h

    codice:
    #include <vector>
    
    // forward reference necessario per CPresenter(DynamicTextures*  pView);
    class DynamicTextures;
    
    class CPresenter {
    	public:
    		CPresenter();
    		CPresenter(DynamicTextures*  pView);
    		~CPresenter();
    		bool InitCV();
    		bool GetTextureFromCam();
    		vector<double>* GetListInsertMarkers();
    		vector<double>* GetListDeleteMarkers();
    	private:
    		struct pimpl;
    		pimpl* pi;
    };
    
    
    
    // CPresenter.cpp
    
    
    #include "Presenter.h"
    #include "DynamicTextures.h"
    #include "altri_include_necessari"
    
    // Definizione della pimpl per CPresenter.
    struct CPresenter::pimpl {
    	pimpl() : pView(0), m_pModel(0) { ; }
    	~pimpl() { delete m_pModel; } 
    
    	DynamicTextures* pView;
    	CModel* m_pModel;	
    };
    
    
    CPresenter::CPresenter() : pi(new CPresenter::pimpl) { ; }
    
    CPresenter::CPresenter( DynamicTextures*  pView ) : pi(new CPresenter::pimpl)
    {
    	pi->m_view = pView;
    	pi->m_pModel = new CModel();
    }
    
    CPresenter::~CPresenter(void)
    {
    	delete pi;
    }
    	
    bool CPresenter::InitCV()
    {
    	return true;
    }	
    
    bool CPresenter::GetTextureFromCam()
    {
    	CTexture texture = pi->m_pModel->GetTextureFromCam()
    	pi->m_view->UpdateTexture(texture.rawdata);
            return true;
    }
    
    vector<double>* CPresenter::GetListInsertMarkers()
    {
    
    	return NULL;
    }
    
    vector<double>* CPresenter::GetListDeleteMarkers()
    {
    
    	return NULL;
    }
    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.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie shodan, bene ma mi da degli errori del tipo:

    e ti invio uno degli errori del linker che mi da l'esempio:
    Error 1 error LNK2005: "public: __thiscall ARToolKitPlus::CameraImpl::CameraImpl(void)" (??0CameraImpl@ARToolKitPlus@@QAE@XZ) already defined in DynamicTextures.obj Model.obj

    Vedo quel 2005 e mi preoccupo , non vorrei che le librerie fossero compilate con vs 2005 , se è cosi basta compilare i sorgenti in vs 2008?
    Puo essere?
    in particolare mi basta aggiungere quest include riga nel model:

    #include "ARToolKitPlus/TrackerSingleMarkerImpl.h"

    che saltano fuori gli errori del linker.
    secondo te l'implementazione dell' MVP ti sembra corretta ?
    Grazie.

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Riporta la parte dell'header TrackerSingleMarkerImpl.h e controlla il costruttore di quella classe.
    Se è definito esternamente alla classe, ma sempre nel file header, deve essere inline.
    Il 2005 si riferisce all'errore del linker, non alla versione dell'ambiente.
    Non ho mai studiato a fondo il pattern MVC, quindi non ti sò dire.
    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.

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.