Cosa fare se odio i file di intestazione C ++?

21

Ero sempre confuso riguardo ai file header. Sono così strani: includi il file .h che non include .cpp ma anche .cpp sono in qualche modo compilati.

Recentemente sono entrato in un progetto di squadra e, naturalmente, sono stati utilizzati sia .h che .cpp.
Capisco che questo è molto importante, ma non posso vivere con il copia-incolla di ogni dichiarazione di funzione in ciascuna delle classi multiple che abbiamo.

Come gestisco la convenzione a 2 file in modo efficiente?
Ci sono degli strumenti per aiutarlo o cambiare automaticamente un file simile a quello di esempio in .h e .cpp? (in particolare per MS VC ++ 2010)

class A
{
...
    Type f(Type a,Type b)
    {
        //implementation here, not in another file!
    }
...
};

Type f(Type a)
{
     //implementation here
}
...
    
posta Oleh Prypin 10.01.2011 - 16:57
fonte

5 risposte

14

Scrivere altro C ++ descrittivo

In C ++ non hai per usare le intestazioni. Puoi definire l'intero oggetto in un file come faresti con C # o Java. Gli sviluppatori C in genere mantengono solo le chiamate esterne in un file di intestazione. Tutte le chiamate interne sarebbero definite nel file .c. Allo stesso modo, è possibile riservare i file .h C ++ per le classi / interfacce (classi astratte virtuali pure) / ecc. che sono destinati ad essere condivisi al di fuori della DLL. Per le classi / le strutture / interfacce interne, ecc. Devi semplicemente includere il file .cpp di cui hai bisogno:

#include<myclass.cpp>

Questo non sembra essere l'approccio più popolare, ma è legale C ++. Sarebbe sicuramente una possibilità per tutto il tuo codice interno. Ciò consente al codice interno e all'insieme di classi di cambiare molto più radicalmente fornendo un'interfaccia più stabile per il codice esterno alla libreria / eseguibile con cui interagire.

Avere l'intera classe in un file renderà più facile fare ciò che vuoi. Non risolverà il problema della ridenominazione di un metodo e di dover cercare in ogni posto che viene chiamato il metodo, ma si assicurerà di avere messaggi di errore più intelligibili. Niente di peggio che avere il tuo header dichiarare un metodo in un modo, ma lo implementa in modo diverso. L'altro codice che chiama il file di intestazione verrà compilato correttamente e otterrete un'eccezione di collegamento, mentre il file di implementazione sarà quello che si lamenta del fatto che il metodo non è stato definito. Quando definisci tutti i metodi in atto (nella dichiarazione della classe effettiva), riceverai lo stesso messaggio di errore indipendentemente dal file che lo include.

Puoi anche dare un'occhiata a questa domanda: Buoni strumenti di refactoring per C ++

Come C / C ++ risolve i file di intestazione / implementazione

Al livello di base C (e C ++ è costruito su quella base), i file di intestazione dichiarano promessa di una funzione / struct / variabile che è sufficiente per consentire a un compilatore di creare il file oggetto . Allo stesso modo i file di intestazione C ++ dichiarano la promessa di funzioni, strutture, classi, ecc. È questa definizione che il compilatore usa per riservare spazio nello stack, ecc.

I file .c o .cpp hanno l'implementazione. Mentre il compilatore converte ogni file di implementazione in un file oggetto, ci sono degli hook per i concetti non implementati (ciò che è stato dichiarato nell'intestazione). Il linker lega i ganci alle implementazioni in altri file oggetto e crea un binario più grande che include tutto il codice (libreria condivisa o eseguibile).

VS specifico

Per quanto riguarda il lavoro con quelli in Visual Studio, ci sono alcuni wizard che aiutano a rendere le cose un po 'più semplici. La procedura guidata della nuova classe creerà la coppia corrispondente di file di intestazione e implementazione. Esiste anche una funzione browser di classe che ti consentirà di dichiarare nuovi metodi. Inietterà la definizione nell'intestazione e lo stub di implementazione nel file .cpp. Visual Studio ha avuto queste caratteristiche per più di un decennio (a patto che li abbia usati).

    
risposta data 10.01.2011 - 17:13
fonte
12

Diventa uno sviluppatore Java.

Se davvero devi continuare a sviluppare in C ++, potresti provare a usare un IDE. Spesso offrono alcuni meccanismi grazie ai quali è possibile aggiungere un metodo a una classe e posiziona automaticamente la dichiarazione nel file .h e la definizione nel file .cpp.

    
risposta data 10.01.2011 - 17:47
fonte
7

Potresti essere interessato al programma makeheaders di Hwaci (coloro che fanno SQLite e Fossil).

Dai anche un'occhiata a come viene costruito il fossile per avere un'idea.

    
risposta data 10.01.2011 - 17:04
fonte
4

Quando scrivi le prime righe di una nuova classe, di solito è perché ne hai bisogno in un posto solo in quel momento. In un secondo momento, potrebbe essere utilizzato in più posti, ma inizialmente non lo è in genere.

Molte delle mie classi iniziano all'inizio del file .cpp corrente. Quando si è stabilizzato abbastanza da usarlo in più posti, lo incollo e incollo su un'intestazione. Anche se spesso la classe scompare velocemente come è apparso.

    
risposta data 10.01.2011 - 23:51
fonte
-1

Come suggerimento per aiutare a gestire i file di intestazione di C ++, è comune usarli senza estensione di file o suffisso di file, come fanno le librerie "GCC".

Se questo è il tuo caso, ti suggerisco di usare l'estensione di file " .hpp" (o unleast " .hxx") o il suffisso del file.

Potrebbe essere necessario configurare il compilatore, l'ambiente dello sviluppatore o il programma Costruito.

    
risposta data 14.02.2011 - 19:18
fonte

Leggi altre domande sui tag