Vra

In watter scenario is dit beter om te gebruik om'n struct vs'n class in C++?

Was dit nuttig?

Oplossing

Die verskil tussen 'n class en 'n struct in C ++ is dat structs het verstek lede en basisse public en klasse het verstek lede en basisse private. Beide klasse en structs kan 'n mengsel van public, protected en private lede het, kan erfenis te gebruik en kan lid funksies het.

Ek sou raai die gebruik van structs as plain-oue-datastrukture sonder enige klas-agtige eienskappe, en die gebruik van klasse as totaal datastrukture met private data en funksies lid.

Ander wenke

As almal merk op daar is eintlik net twee werklike taalverskille:

  • struct standaard openbare toegang en class gebreke aan private toegang.
  • Wanneer erf, struct standaard public erfenis en class standaard erfenis private. (Ironies genoeg, as met so baie dinge in C ++, die standaard is agteruit: public erfenis is by verre die mees algemene keuse, maar mense selde verklaar structs net om te bespaar op te tik die "public" navraag
  • .

Maar die werklike verskil in die praktyk is tussen 'n class / struct wat 'n konstruktor / destructor verklaar en een wat nie. Daar is sekere waarborge aan 'n "plain-oue-data" POD tipe, wat nie meer van toepassing as jy oor die bou van die klas se neem. Om hierdie onderskeid duidelik te hou, baie mense doelbewus net gebruik structs vir POD tipes, en, as hulle gaan om enige metodes glad, gebruik classes voeg. Die verskil tussen die twee fragmente hieronder is anders betekenisloos:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Terloops, hier is 'n draad met 'n paar goeie verduidelikings oor wat "tipe POD" eintlik beteken: Wat is POD tipes in C ++? )

Daar is baie wanopvattings in die bestaande antwoorde.

Beide class en struct verklaar'n klas.

Ja, jy mag hê om te herrangskik jou toegang tot die wysiging van die sleutelwoorde in die klas definisie, afhangende van wat navraag wat jy gebruik om te verklaar dat die klas.

Maar, buite sintaksis, die net rede om te kies die een oor die ander is konvensie/styl/voorkeur.

Sommige mense wil om te hou met die struct navraag vir klasse sonder lid funksies, omdat die gevolglike definisie "lyk soos" 'n eenvoudige struktuur van C.

Net so, sommige mense hou daarvan om te gebruik om die class navraag vir klasse met lid funksies en private data, want dit sê: "klas" op dit en daarom lyk soos voorbeelde van hul gunsteling-boek op die objek-georiënteerde programmering.

Die realiteit is dat dit heeltemal aan jou en jou span, en dit sal letterlik geen verskil hoegenaamd na jou program.

Die volgende twee klasse is absoluut ekwivalent in elke opsig behalwe hul naam:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Jy kan selfs skakel sleutelwoorde wanneer redeclaring:

class Foo;
struct Bar;

(alhoewel dit breek Visual Studio bou as gevolg van nie-nakoming, so dat die samesteller sal stoot'n waarskuwing wanneer jy dit doen.)

en die volgende uitdrukkings beide evalueer om te ware:

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

Doen daarop te let, al, dat jy kan nie skakel die sleutelwoorde wanneer herdefiniëring;dit is net omdat (per die een-definisie reël) duplikaat klas definisies oor vertaling eenhede moet "die bestaan van die dieselfde volgorde van tekens".Dit beteken dat jy kan nie eens ruil const int member; met int const member;, en het niks te doen met die semantiek van class of struct.

Die enigste keer dat ek 'n struct in plaas van 'n klas is wanneer waarby 'n functor reg voordat dit gebruik word in 'n funksie oproep en wil sintaksis ter wille van duidelikheid te verminder. Bv:.

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

Van die C++ VRAE Lite:

Die lede en die basis klasse van'n struct is die publiek by verstek, terwyl in die klas, hulle standaard privaat.Let daarop:jy moet jou basis klasse uitdruklik openbare, private, of te beskerm, eerder as om te vertrou op die standaard.

struct en klas is anders funksioneel ekwivalent.

OK, genoeg van wat pieperig skoon techno praat.Emosioneel, het die meeste ontwikkelaars maak'n sterk onderskeid tussen'n klas en'n struct.'n struct net voel soos'n oop stapel van stukkies met baie min in die pad van inkapseling of funksionaliteit.'n klas voel soos'n lewende en verantwoordelike lid van die samelewing met intelligente dienste, 'n sterk inkapseling versperring, en'n goed gedefinieerde koppelvlak.Sedert dit is die konnotasie die meeste mense reeds het, moet jy waarskynlik gebruik om die struct navraag as jy'n klas wat baie min metodes en het'n openbare data (soos die dinge wat nie bestaan nie in goed ontwerpte stelsels!), maar anders moet jy waarskynlik gebruik om die klas navraag.

Een plek waar 'n struct nuttig is vir my is wanneer ek 'n stelsel wat is die ontvangs van formaat boodskappe vaste (oor sê, 'n seriepoort) van 'n ander stelsel. Jy kan die stroom van grepe gewerp in 'n struct dat julle lande definieer, en dan maklik toegang tot die velde.

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);
}

Dit is duidelik dat, dit is dieselfde ding wat jy sou doen in C, maar ek vind dat die oorhoofse van 'om die boodskap te ontsyfer in 'n klas is gewoonlik nie die moeite werd.

Jy kan "struct" in C ++ gebruik as jy skryf 'n biblioteek wie se internals is C ++ maar die API genoem kan word deur óf C of C ++ kode. Jy maak net 'n enkele kop wat structs en globale API funksies wat jy bloot te stel aan beide C en C ++ kode soos hierdie bevat:

// 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

Dan kan jy 'n funksie bar () in 'n C ++ lêer met C ++ kode te skryf en maak dit call able van C en die twee wêrelde kan data te deel deur middel van die verklaarde struct se. Daar is ook ander tekortkominge natuurlik wanneer vermenging C en C ++, maar dit is 'n eenvoudige voorbeeld.

As elkeen sê, die enigste werklike verskil is die verstek toegang. Maar ek gebruik veral struct wanneer ek wil nie enige soort van inkapseling met 'n eenvoudige data klas, selfs al is ek 'n paar helper metodes te implementeer. Byvoorbeeld, wanneer ek nodig het iets soos hierdie:

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

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

Structs ( peule meer in die algemeen) is handig wanneer jy die verskaffing van 'n C-versoenbaar koppelvlak met 'n C ++ implementering, want hulle is draagbaar oor taal grense en linker-formaat.

As dit nie 'n probleem vir jou, dan dink ek die gebruik van die "struct" in plaas van "klas" is 'n goeie kommunikeerder van voorneme (as @ZeroSignal hierbo gesê). Structs het ook meer voorspelbare kopiëring semantiek, so hulle is nuttig vir inligting wat jy van plan is om eksterne media te skryf of stuur oor die draad.

Structs is ook handig te pas kom vir verskeie metaprogramming take, soos eienskappe templates wat net 'n klomp van die afhanklike typedefs bloot:

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

... Maar dit is regtig net gebruik te maak van standaard beskerming vlak om openbare struct se ...

Vir C ++, daar is regtig nie veel van 'n verskil tussen structs en klasse. Die belangrikste funksionele verskil is dat lede van 'n struct is publiek by verstek, terwyl hulle private by verstek in klasse. Anders, so ver as die taal betref, is hulle gelyk.

Dit gesê, ek is geneig om structs gebruik in C ++ soos ek doen in C #, soortgelyk aan wat Brian het gesê. Structs is eenvoudig data houers, terwyl klasse gebruik word vir voorwerpe wat nodig het om op te tree op die data in bykomend tot net vashou aan dit.

Om my eie vraag (skaamteloos) beantwoord, soos reeds genoem, toegang regte is die enigste verskil tussen hulle in C ++.

Ek is geneig om 'n struct vir slegs data-berging gebruik. Ek sal toelaat dat dit 'n paar helper funksies te kry as dit maak die werk met die data makliker. Maar so gou as die data vloei beheer vereis (dit wil sê getters / etters wat in stand te hou of te beskerm 'n interne staat) of begin acquring enige groot funksie (basies meer voorwerp-agtige), dit sal kry 'opgegradeer 'n klas om beter te kommunikeer opset.

Dit is pretty much dieselfde ding. Te danke aan die magie van C ++, kan 'n struct funksies hou, gebruik erfenis, geskep met behulp van "nuwe" en so aan, net soos 'n klas

Die enigste funksionele verskil is dat 'n klas begin met private toegang regte, terwyl 'n struct begin met openbare. Dit is die handhaaf backwards compatibility met C.

In die praktyk, het ek altyd gebruik structs as data houers en klasse as voorwerpe.

Klas.

lede klas is privaat by verstek.

class test_one {
    int main_one();
};

is gelykstaande aan

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

As jy probeer

int two = one.main_one();

Ons sal 'n fout kry: main_one is private omdat sy nie toeganklik. ons kan los dit deur die initialiseren dit deur die spesifiseer van sy 'n openbare di

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

struct.

'n struct is 'n klas waar lede is by verstek publiek.

struct test_one {
    int main_one;
};

Beteken main_one is privaat wil sê

class test_one {
  public:
    int main_one;
};

Ek gebruik structs vir datastrukture waar die lede enige waarde kan neem, is dit makliker dat die pad.

hulle is dieselfde ding met verskillende standaard (privaat by verstek vir class, en openbare by verstek vir struct), so in teorie hulle is heeltemal verwissel.

so, as ek wil net 'n paar inligting te verpak om rond te beweeg, gebruik ek 'n struct, selfs as ek 'n paar metodes daar (maar nie baie). As dit is 'n meestal-ondeursigtig ding, waar die hoofgebruik via metodes om die data lede sal wees, en nie direk, ek gebruik 'n volle klas.

Structs by verstek het openbare toegang en klasse by verstek het private toegang.

Ek persoonlik gebruik structs vir Data Transfer voorwerpe of as Waarde voorwerpe. Wanneer dit gebruik word as sodanig verklaar ek alle lede as const om verandering te voorkom deur ander kode.

'n voordeel van struct oor class is dat dit spaar een lyn van kode, as die voldoening aan die "eerste openbare lede, dan private".In hierdie lig, ek vind die navraag class nutteloos.

Hier is nog'n rede vir die gebruik van slegs struct en nooit class.Sommige kode styl riglyne vir die C++ stel voor dat die gebruik van kleinletters vir die funksie makro, die rasionaal hiervoor is dat wanneer die makro omgeskakel word na'n inline funksie, die naam moet nie verander moet word.Dieselfde hier.Jy het jou mooi C-styl struct en een dag, jy vind uit wat jy nodig het om by te voeg'n konstruktor, of'n paar gerief metode.Doen jy dit verander na'n class?Oral?

Onderskei tussen structs en classes is net te veel moeite, om in die manier van doen wat ons moet doen - ontwikkeling.Soos so baie van die C++se probleme, dit spruit uit die sterk begeerte vir die agteruit verenigbaarheid.

Tegnies beide is dieselfde in C ++ -. Byvoorbeeld is dit moontlik vir 'n struct operateurs het oorlaai ens

Maar:

Ek gebruik structs wanneer ek wil inligting van verskeie soorte gelyktydig slaag Ek gebruik klasse wanneer die ek die hantering van 'n "funksionele" voorwerp.

Hoop dit help.

#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;
};

Byvoorbeeld, ek terugkeer 'n struct student in die get ... () metodes hier -. Geniet

  

Wanneer sou jy kies om struct gebruik   en toe na die klas gebruik in C ++?

Ek gebruik struct toe ek functors en POD definieer. Anders Ek gebruik 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; }
};

Ek gebruik structs wanneer ek nodig het om te tik POD of functor skep.

Alle klas lede is privaat by verstek en al struct lede is by verstek publiek. Klas het verstek private basisse en struct het die standaard openbare basisse. Struct in geval van C kan nie lid funksies waar as in die geval van C ++ ons kan hê lid funksies word bygevoeg aan die struct. Anders as hierdie verskille, kan ek niks verbasend vind oor hulle.

Soos ander het daarop gewys

  • beide ekwivalent afgesien van standaard sigbaarheid
  • daar dalk redes gedwing word om die een of die ander vir een of ander rede
  • gebruik

Daar is 'n duidelike aanbeveling oor wanneer om te gebruik wat uit Stroustrup / Sutter:

  

gebruik klas as die klas het 'n invariante; gebruik struct as die data lede onafhanklik kan wissel

Hou egter in gedagte gehou word dat dit nie wys wees om te stuur verklaar sth. as 'n klas (class X;) en definieer dit as struct (struct X { ... }). Dit kan werk op 'n paar linkers (bv g ++) en kan misluk op ander (bv MSVC), sodat jy jouself sal vind in ontwikkelaar hel.

Ek gebruik struct net wat ek nodig het om 'n paar data te hou sonder enige lid funksies wat verband hou met dit (om te werk op die lid data) en om direkte toegang tot die data veranderlikes.

Bv. Lees / skryf data van lêers en socket strome ens Slaag funksie argumente in 'n struktuur waar die funksie argumente is te veel en funksie sintaksis lyk te lank

Tegnies is daar geen groot verskil tussen klas en struture behalwe verstek toeganklikheid. Meer oor dit hang af van programmeringstyl hoe jy dit gebruik.

Ek het gedink dat Structs is bedoel as 'n datastruktuur (soos 'n tipe multi-data verskeidenheid van inligting) en klasse is inteded vir Kode Packaging (soos versamelings van subroetines & funksies) ..

: (

Ek gebruik nooit "struct" in C ++.

Ek kan nie ooit 'n scenario waar jy 'n struct sal gebruik wanneer jy wil private lede, tensy jy opsetlik probeer verwarrend te wees dink.

Dit blyk dat die gebruik van structs is meer van 'n sintaktiese aanduiding van hoe die data sal gebruik word, maar ek wil eerder net 'n klas en probeer om dit duidelik in die naam van die klas maak, of deur middel van kommentaar.

Bv.

class PublicInputData {
    //data members
 };
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top