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

    [C++] Strutturare un progetto - creare namespaces - sottodirectory (packages)

    Salve,

    ho un progettino scritto in C++ che ha la seguente struttura:
    codice:
    .
    |-- subdir1
    |   |-- ClassA.cpp
    |   `-- ClassA.h
    |-- subdir2
    |   |-- ClassB.cpp
    |   |-- ClassB.h
    |   |-- ClassC.cpp
    |   `-- ClassC.h
    |-- subdir3
    |   |-- ClassD.cpp
    |   `-- ClassD.h
    `-- main.cpp
    Ho strutturato il progetto in questo modo perché ho bisogno di suddividere le varie classi in diversi package, e riesco a far funzionare tutto, ad esempio includendo una classe di un package nella classe di un altro semplicemente facendo (ad esempio) #include "../subdir3/ClassD.h" da ClassB.h.

    Vorrei capire se sia opportuno associare le varie subdir a diversi namespace, e capire come si fa (ho letto che negli header si dichiarano i namespace e si elencano le classi, ma non ho capito se bisogna fare un header a parte che elenca tutte le classi di un "package" o altro).

    Inoltre vorrei capire dove conviene collocare tutti gli header. Ho visto che Eclipse fa in un modo (come ho riportato sopra), Qt Creator in un altro; ma allora non capisco quale sia l'approccio più corretto.

    Come dovrei fare?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non c'è un approccio corretto: l'importante è che il compilatore sappia dove trovare header file e source file. Un approccio molto seguito è mettere tutti gli header file in un percorso e i source file in un altro.

    Non c'è nessuna relazione tra namespace e directory: un namespace introduce soltanto una ulteriore elemento di distinzione tra una tua classe e una classe omonima scritta da qualcun altro, ma al compilatore non importa se lo stesso namespace è presente in più file e in cartelle diverse.
    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
    Ok, ma da qualche parte ho letto che i namespace, di fatto sono quelli che in Java sono i packages, quindi per questo motivo, mi chiedevo come fare qualcosa di analogo.
    Ad esempio, se creassi una mia libreria ipotetica, allora avrebbe senso creare un namespace che racchiude tutte le classi della mia libreria. In un certo senso, le mie subdir, del primo post, potrebbero essere delle librerie. Per questo ho fatto questa domanda.

    Quindi per far sapere al compilatore dove sono gli header, basta che glielo indico nelle proprietà del progetto (in eclipse, ad esempio)?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se non ricordo male in Java i packages indicano anche un percorso. Se è così i namespace C++ non hanno niente a che fare con questo. Un header files può contenere diversi namespace al suo interno, namespace annidati, namespace anonimi etc.
    http://www.cplusplus.com/doc/tutorial/namespaces/

    Se tu crei una tua libreria e la metti un namespace è corretto, ma non sei obbligato a dividere i vari file in cartelle.

    Presumo che l'organizzazione che hai mostrato sia dovuta alla natura Java-oriented di Eclipse (che di per se non è sbagliata: solo un po' complicata da gestire, forse).

    Quindi per far sapere al compilatore dove sono gli header, basta che glielo indico nelle proprietà del progetto (in eclipse, ad esempio)?
    Si. In genere si indica la cartella padre di quella dove sono posti gli header file, poi puoi usare le parentesi < > per includere gli header che interessano. Devi però aggiungere anche i file .cpp al progetto altrimenti il linker protesta.
    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
    Originariamente inviato da shodan
    Se non ricordo male in Java i packages indicano anche un percorso. Se è così i namespace C++ non hanno niente a che fare con questo. Un header files può contenere diversi namespace al suo interno, namespace annidati, namespace anonimi etc.
    http://www.cplusplus.com/doc/tutorial/namespaces/
    Sì, in realtà indicano anche un percorso, nel senso che quando includi un package, fai un "import a.b.c.d" dove a, b, c e d di fatto sono delle directory che contengono classi, quindi stai indicando alla classe in uso, che deve includere altre classi che stanno nel percorso a.b.c.d.
    Pensavo che il namespace fosse una cosa analoga, nel senso di "raggruppare" classi che riguardano una stessa "circostanza" in un progetto. Ad esempio, se ho un progetto in cui ho una serie di classi che realizzano la logica DAO per l'accesso ad un database, quelle saranno tutte dello stesso genere, e in Java le racchiudo in un package chiamato "dao" (ad esempio). Allo stesso modo in C++, quello che avrei fatto sarebbe stato appunto quello di catalogarle tutte nello stesso namespace.

    Originariamente inviato da shodan
    Se tu crei una tua libreria e la metti un namespace è corretto, ma non sei obbligato a dividere i vari file in cartelle.

    Presumo che l'organizzazione che hai mostrato sia dovuta alla natura Java-oriented di Eclipse (che di per se non è sbagliata: solo un po' complicata da gestire, forse).
    Sì, penso che sia quello il punto.

    Originariamente inviato da shodan
    Si. In genere si indica la cartella padre di quella dove sono posti gli header file, poi puoi usare le parentesi < > per includere gli header che interessano. Devi però aggiungere anche i file .cpp al progetto altrimenti il linker protesta.
    Certo. Ora faccio delle prove. Grazie!

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da fbcyborg
    Pensavo che il namespace fosse una cosa analoga, nel senso di "raggruppare" classi che riguardano una stessa "circostanza" in un progetto.
    Da un punto di vista pragmatico un namespace è un trucco introdotto per evitare le collisioni dei nomi. Mettiamo che tu voglia scrivere una tua classe vector<> e decidessi di usarla insieme alla classe vector<> della libreria standard (premettendo lo using namespace std), il compilatore non saprebbe cosa dovrebbe istanziare: se la vector<> standard o la tua. Mettendo la tua classe in un namespace, basta premetterlo alla tua classe quando vuoi usarla e i conflitti spariscono.

    Ad esempio, se ho un progetto in cui ho una serie di classi che realizzano la logica DAO per l'accesso ad un database, quelle saranno tutte dello stesso genere, e in Java le racchiudo in un package chiamato "dao" (ad esempio). Allo stesso modo in C++, quello che avrei fatto sarebbe stato appunto quello di catalogarle tutte nello stesso namespace.
    In questo caso il package Java è la libreria C++ (che sia in .lib o sorgente non importa. In quest'ultimo caso è comodo dividere in dao\include e dao \src, ad esempio), ma come già detto il namespace non è obbligatorio (anche se molto comodo).
    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
    Ok, ti ringrazio, ora è molto più chiaro!

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.