Domanda

In quali scenari è meglio usare un struct vs un class in C++?

È stato utile?

Soluzione

Le differenze tra un class e un struct in C++ sono le strutture che hanno di default public membri e basi e le classi sono di default private membri e basi.Entrambe le classi e le strutture possono avere una miscela di public, protected e private membri, possono utilizzare l'ereditarietà e può avere funzioni membro.

Mi consiglia di utilizzare le strutture come plain old-strutture di dati, senza alcun classe-come caratteristiche, e l'utilizzo di classi come aggregato di strutture di dati con private dati e funzioni membro.

Altri suggerimenti

Come tutti gli altri note ci sono solo due effettive differenze di lingua:

  • struct valori di default per l'accesso al pubblico e class di default l'accesso privato.
  • Quando eredita, struct di default public eredità e class di default private l'ereditarietà.(Ironia della sorte, come con tante cose in C++, il valore di default è indietro: public l'ereditarietà è di gran lunga più scelta comune, ma la gente raramente dichiarare structsolo per risparmiare sui digitando "public"la parola chiave.

Ma la vera differenza, in pratica, tra un class/struct che dichiara un costruttore/distruttore e uno che non.Ci sono alcune garanzie per un "semplice" vecchio "dati" tipo POD, che non è più possibile applicare una volta a prendere in consegna la classe di costruzione.Per mantenere questa distinzione chiara, molte persone deliberatamente di utilizzare solo structs per i tipi di CONTENITORE, e, se hanno intenzione di aggiungere metodi a tutti, uso classes.La differenza tra i due frammenti di seguito è altrimenti priva di senso:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Per inciso, qui c'è un thread con alcune buone spiegazioni su ciò che "tipo", in realtà significa: Quali sono i tipi di CONTENITORE in C++?)

Ci sono un sacco di idee sbagliate in answers.

Entrambi class e struct dichiarare una classe.

Sì, si può avere per riordinare l'accesso di modificare le parole chiave all'interno della definizione della classe, a seconda della parola chiave è utilizzata per dichiarare la classe.

Ma, al di là della sintassi, la solo motivo in più per scegliere uno sopra l'altro, la convenzione/in stile/di preferenza.

Alcune persone, come per attaccare con l' struct parola chiave per classi senza funzioni membro, perché la definizione così "sembra" una struttura semplice da C.

Allo stesso modo, alcune persone piace usare il class parola chiave per le classi con funzioni di membro, e private i dati, perché si dice "classe" e dunque come esempi del loro libro preferito sulla programmazione object-oriented.

La realtà è che questo completamente a voi e il vostro team, e ti fanno letteralmente nessuna differenza per il vostro programma.

Le seguenti due classi sono assolutamente equivalenti in ogni modo, tranne il loro nome:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Si può anche passare le parole chiave quando si redeclaring:

class Foo;
struct Bar;

(anche se questo interruzioni di Visual Studio genera a causa di non conformità, in modo che il compilatore emette un avviso quando si esegue questa operazione.)

e le seguenti espressioni sia per valutare al vero:

std::is_class<Foo>::value
std::is_class<Bar>::value

Si noti, tuttavia, che lei non può cambiare le parole chiave quando la ridefinizione;questo è solo perché (per una definizione di regole) duplicare le definizioni di classe attraverso le unità di traduzione deve "essere la stessa sequenza di token".Ciò significa che è possibile anche scambio const int member; con int const member;, e non ha nulla a che fare con la semantica di class o struct.

L'unica volta che uso una struct invece di una classe è quando si dichiara un funtore a destra prima di utilizzarlo in una chiamata di funzione e si desidera ridurre al minimo la sintassi per motivi di chiarezza.ad esempio:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

Dal C++ FAQ Lite:

I membri e le classi di base di una struttura per impostazione predefinita sono pubbliche, mentre in classe, che di default a privato.Nota:si dovrebbe rendere il vostro classi di base in modo esplicito pubblico, privato o protetto, piuttosto che fare affidamento sui valori predefiniti.

struct e class altrimenti sono funzionalmente equivalenti.

OK, abbastanza pulita techno parlare.Emotivamente, la maggior parte degli sviluppatori di rendere una forte distinzione tra una classe e una struct.Una struttura che si sente semplicemente simile a un mucchio di bit con molto poco in termini di incapsulamento o la funzionalità.Una classe si sente come un essere vivente e come membri responsabili della società di servizi intelligenti, un forte incapsulamento barriera, e un'interfaccia ben definita.Visto che la connotazione più persone che già hanno, probabilmente è necessario utilizzare la parola chiave struct se si dispone di una classe che ha pochi metodi pubblici dati (tali cose esistono sistemi ben progettati!), ma per il resto probabilmente è necessario utilizzare la parola chiave class.

Un luogo in cui una struttura è stato utile per me è da quando ho un sistema di ricezione fissa i messaggi in formato (oltre dire, una porta seriale) da un altro sistema.Si può lanciare il flusso di byte in una struttura che definisce i campi, e quindi facilmente accedere ai campi.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Ovviamente, questa è una cosa che si dovrebbe fare in C, ma trovo che il sovraccarico di dover decodificare il messaggio in una classe è di solito non ne vale la pena.

È possibile utilizzare "struct" in C++, se si sta scrivendo una biblioteca i cui interni sono C++, ma l'API può essere chiamato da codice C o C++.È sufficiente fare una sola intestazione che contiene le strutture e globale delle funzioni API che si espone sia in C e C++ codice come questo:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

Allora si può scrivere una funzione in un bar() in un file C++ utilizzando il codice C++ e renderlo chiamata da C e i due mondi possono condividere i dati attraverso il dichiarato struct s.Ci sono altri avvertimenti, naturalmente, quando la miscelazione di C e C++, ma questo è un esempio semplificato.

Come ogni uno dice, l'unica vera differenza è l'impostazione predefinita di accesso.Ma io in particolare uso struct quando non voglio alcun tipo di incapsulamento con una semplice classe di dati, anche se ho implementare alcuni metodi di supporto.Per esempio, quando ho bisogno di qualcosa come questo:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

Struct (Baccelli, più in generale) sono a portata di mano quando si sta fornendo un C-interfaccia compatibile con una implementazione di C++, dato che sono portatili di là delle frontiere linguistiche e linker formati.

Se questo non è un problema per voi, allora suppongo che l'uso della "struttura" invece di "classe" è un buon comunicatore di intenti (come @ZeroSignal detto sopra).Le strutture, inoltre, sono più prevedibili copia semantica, in modo che siano utili per i dati che si desidera scrivere su supporti esterni o inviare attraverso il filo.

Le strutture sono anche a portata di mano per i vari metaprogrammazione attività, come le caratteristiche dei modelli che solo esporre un gruppo di dipendenti typedef:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

...Ma che davvero solo approfittando di una struttura predefinita del livello di protezione della pubblica...

Per il C++, non c'è molto di una differenza tra le strutture e le classi.La principale differenza funzionale è che i membri di una struttura per impostazione predefinita sono pubbliche, mentre sono privati per impostazione predefinita nelle classi.In caso contrario, per quanto riguarda la lingua è interessato, sono equivalenti.

Detto questo, io tendo a usare le strutture in C++, come faccio in C#, simile a quello che Brian ha detto.Le strutture sono semplici contenitori di dati, mentre le classi sono utilizzati per gli oggetti che hanno bisogno di agire sui dati in aggiunta a semplicemente tenendo premuto su di esso.

Per rispondere alla mia domanda (spudoratamente), Come già accennato, i privilegi di accesso sono l'unica differenza tra di loro in C++.

Io tendo ad usare una struct per la memorizzazione di dati solo.Ti permettono di ottenere un paio di funzioni di supporto se si rende il lavoro con i dati più facile.Tuttavia, non appena i dati richiede il controllo di flusso (es.getter/setter mantenere o proteggere uno stato interno) o inizia acquring qualsiasi funzionalità principali (praticamente più di un oggetto-come), sarà aggiornato a una classe per meglio comunicare le finalità.

Sono praticamente la stessa cosa.Grazie alla magia del C++, una struttura che può contenere funzioni, utilizzare l'ereditarietà, creato utilizzando il "nuovo" e così via, proprio come una classe

L'unica differenza funzionale è che una classe inizia con accesso privato dei diritti, mentre una struttura comincia con il pubblico.Questo è il mantenere la compatibilità con C.

In pratica, ho sempre usato le strutture come i titolari dei dati e classi di oggetti.

Classe.

I membri della classe sono privati per impostazione predefinita.

class test_one {
    int main_one();
};

È equivalente a

class test_one {
  private:
    int main_one();
};

Quindi, se si tenta

int two = one.main_one();

Ci sarà un errore: main_one is private perché la sua non è accessibile.Siamo in grado di risolverlo con l'inizializzazione, specificando il suo pubblico ie

class test_one {
  public:
    int main_one();
};

Struct.

Una struttura è una classe in cui i membri sono pubblici per impostazione predefinita.

struct test_one {
    int main_one;
};

Significa main_one è privato ie

class test_one {
  public:
    int main_one;
};

Io uso le strutture per le strutture di dati, in cui i membri possono assumere qualsiasi valore, è più facile in questo modo.

sono la stessa cosa con diverse impostazioni di default (privati per impostazione predefinita per class, e pubblico per impostazione predefinita per struct), quindi in teoria sono totalmente intercambiabili.

così, se voglio solo pacchetto di alcune info per muoversi, io uso una struttura, anche se ho messo un paio di metodi (ma non molti).Se è per lo più opachi cosa, dove l'uso principale sarebbe tramite metodi, e non direttamente ai dati di tutti i soci, un completo utilizzo della classe.

Le strutture per impostazione predefinita hanno accesso del pubblico e le classi di default hanno accesso privato.

Personalmente io uso le strutture per il Trasferimento di Dati Oggetti o gli Oggetti di Valore.Quando viene utilizzato come tale io dichiaro che tutti i membri come const per impedire la modifica da altro codice.

Un vantaggio di struct oltre class è che si salva una sola riga di codice, se l'adesione a "primi membri pubblici, privato di allora".In questa luce, trovo la parola chiave class inutile.

Ecco un altro motivo per l'utilizzo di solo struct e mai class.Un po ' di codice di stile linee guida per il C++ suggeriscono di usare le lettere minuscole per la funzione macro, sostenendo che quando la macro viene convertito in una funzione inline, il nome non ha bisogno di essere cambiato.Stesso qui.Hai il tuo bel C-stile struct e un giorno, si scopre che è necessario aggiungere un costruttore, o di alcune comodità metodo.Non si cambia a una class?In tutto il mondo?

Distinguendo tra structs e classes è semplicemente troppo fastidio, ottenere nel modo di fare quello che dovremmo fare di programmazione.Come molti di C++i problemi, nasce dal forte desiderio per la compatibilità all'indietro.

Tecnicamente entrambi sono la stessa cosa in C++, per esempio, è possibile che una struttura per avere overload degli operatori, etc.

Tuttavia :

Io uso le strutture quando voglio passare informazioni di molteplici tipi contemporaneamente Io uso le classi quando ho a che fare con un "funzionale" dell'oggetto.

Speranza che aiuta.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Per esempio, io sono la restituzione di una struct studente in get...() metodi di qui - godere.

Quando si sceglie di utilizzare struct e quando utilizzare una classe in C++?

Io uso struct quando mi definiscono functors e POD.Altrimenti io uso class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

Io uso le strutture quando ho bisogno di creare tipo POD o funtore.

Tutti i membri della classe sono privati per impostazione predefinita e tutti i membri struttura per impostazione predefinita sono pubbliche.La classe ha privata di default basi e la Struttura ha di default basi pubbliche.Struct in caso di C non hanno funzioni di membro dove, come nel caso del C++ si può avere funzioni di membro aggiunto per la struttura.Oltre a queste differenze, e non trovo nulla di sorprendente su di loro.

Come altri hanno sottolineato

  • entrambi sono equivalenti a prescindere dalla visibilità predefinita
  • ci possono essere motivi per essere costretti a utilizzare l'uno o l'altro per qualsiasi motivo

C'è una chiara indicazione su quando utilizzare che da Stroustrup/Sutter:

Utilizzare la classe se la classe ha un invariante;utilizzare struct se i membri di dati può variare in modo indipendente

Tuttavia, tenere a mente che non è saggio avanti dichiarare sth.come classe (class X;) e definire come struct (struct X { ... }).Si può lavorare su alcuni linker (ad esempio, g++) e può non su altri (ad esempio, MSVC), così vi troverete in sviluppatore inferno.

Io uso struct solo quando ho bisogno di tenere un po ' di dati, senza alcun membro funzioni ad esso associato (ad operare su dati di membri) e per l'accesso a dati variabili direttamente.

Ad esempio:La lettura/Scrittura dei dati nei file e la presa di flussi etc.Passando gli argomenti di una funzione in una struttura dove gli argomenti della funzione sono troppi e sintassi della funzione sembra troppo lunga.

Tecnicamente non c'è grande differenza tra la classe e struttura ad eccezione di default di accessibilità.Più su di esso dipende da stile di programmazione come lo si utilizza.

Ho pensato che le Strutture è stato inteso come una Struttura di Dati (come un multi-tipo di dati array di informazioni) e classi era inteso per il Codice di Imballaggio (come collezioni di sottoprogrammi e funzioni)..

:(

Io non uso mai "struct" in C++.

Io non riesco a immaginare uno scenario in cui è possibile utilizzare una struttura quando si desidera che i membri privati, a meno che non si sta deliberatamente cercando di essere fonte di confusione.

Sembra che l'utilizzo di strutture è più di un sintattica indicazione di come i dati potranno essere utilizzati, ma direi piuttosto fare una classe e cercare di rendere esplicito il nome della classe, o attraverso i commenti.

E. g.

class PublicInputData {
    //data members
 };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top