In welchen Szenarien ist es besser, eine struct
gegen ein class
in C++?
- Was sind die Unterschiede zwischen struct und class in C++? (30 Antworten )
Antworten
Zu viele Anzeigen?Sie können "struct" in C++ verwenden, wenn Sie eine Bibliothek schreiben, deren Interna C++ sind, deren API aber sowohl von C- als auch von C++-Code aufgerufen werden kann. Sie erstellen einfach einen einzigen Header, der Structs und globale API-Funktionen enthält, die Sie sowohl für C- als auch für C++-Code wie folgt offenlegen:
// 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
Dann kann man eine Funktion bar() in einer C++-Datei mit C++-Code schreiben und sie von C aus aufrufbar machen, und die beiden Welten können Daten über die deklarierten Strukturen gemeinsam nutzen. Es gibt natürlich noch andere Vorbehalte, wenn man C und C++ mischt, aber dies ist ein vereinfachtes Beispiel.
Eine Stelle, an der eine Struktur für mich hilfreich war, ist, wenn ich ein System habe, das Nachrichten mit festem Format (beispielsweise über eine serielle Schnittstelle) von einem anderen System empfängt. Sie können den Strom von Bytes in eine Struktur umwandeln, die Ihre Felder definiert, und dann einfach auf die Felder zugreifen.
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);
}
Natürlich ist dies dasselbe, was man in C tun würde, aber ich finde, dass der Overhead, der durch das Dekodieren der Nachricht in eine Klasse entsteht, es normalerweise nicht wert ist.
Wie alle sagen, ist der einzige wirkliche Unterschied der Standardzugang. Aber ich verwende struct vor allem dann, wenn ich keine Kapselung mit einer einfachen Datenklasse haben möchte, auch wenn ich einige Hilfsmethoden implementiere. Zum Beispiel, wenn ich etwas wie dieses brauche:
struct myvec {
int x;
int y;
int z;
int length() {return x+y+z;}
};
Um meine eigene Frage (schamlos) zu beantworten: Wie bereits erwähnt, sind die Zugriffsrechte der einzige Unterschied zwischen ihnen in C++.
Ich neige dazu, eine Struktur nur für die Datenspeicherung zu verwenden. Ich werde es erlauben, ein paar Hilfsfunktionen zu erhalten, wenn es die Arbeit mit den Daten einfacher macht. Sobald die Daten jedoch eine Flusskontrolle erfordern (d.h. Getter/Setter, die einen internen Zustand aufrechterhalten oder schützen) oder eine größere Funktionalität benötigen (im Grunde objektähnlicher), wird sie zu einer Klasse "aufgewertet", um die Absicht besser zu kommunizieren.
Strukturen ( PODs ) sind praktisch, wenn Sie eine C-kompatible Schnittstelle mit einer C++-Implementierung bereitstellen, da sie über Sprachgrenzen und Linkerformate hinweg portabel sind.
Wenn das für Sie keine Rolle spielt, dann ist die Verwendung von "struct" anstelle von "class" ein guter Indikator für die Absicht (wie @ZeroSignal oben sagte). Strukturen haben auch mehr vorhersehbar Kopieren Semantik, so dass sie für Daten, die Sie beabsichtigen, auf externe Medien zu schreiben oder über den Draht zu senden nützlich sind.
Strukturen sind auch praktisch für verschiedene Metaprogrammieraufgaben, wie z.B. Traits-Templates, die einfach eine Reihe von abhängigen Typdefs offenlegen:
template <typename T> struct type_traits {
typedef T type;
typedef T::iterator_type iterator_type;
...
};
...Aber das ist eigentlich nur ein Ausnutzen der Tatsache, dass die Standardschutzstufe von struct öffentlich ist...