Kann ich eine neue struct auf dem heap, ohne die Definition eines Konstruktors?
Ich verstehe, dass es gibt sehr wenige Unterschiede zwischen Strukturen und Klassen in c++ (zwei?). Sei es wie es sei, ich habe angewiesen worden, zu verwenden, Strukturen zu definieren, einfache kleine Dinge wie Knoten, die vielleicht nicht brauchen member-Funktionen (trotz der Tatsache, dass ich technisch include include member-Funktionen). Zum Beispiel könnte ich definieren einen Knoten als privates Mitglied einer LinkedList-Klasse wie folgt:
class LinkedList {
struct Node {
MyObject *data;
Node *next;
};
Node *list;
};
In diesem Fall jedoch, ist es möglich, erstellen Sie eine neue Instanz von diesem struct auf dem heap, oder brauche ich das definieren eines Konstruktors? Gibt es eine Möglichkeit zu schaffen, die Dinge über den Haufen, ohne den new-operator? Oder noch besser: ist es überflüssig für mich, Klammern sich so fest an die Vorstellung, dass ich nicht definieren member-Funktionen für Strukturen? Sollte ich gehen Sie einfach weiter und definieren eine? Oder wenn ich das täte, wäre es, zuzugeben, dass Knoten wirklich irgendetwas, um eine innere Klasse, sondern als eine innere Struktur? Soll ich mir wirklich sorgen über diese Dinge überhaupt? Was ist lesbarer?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als zuvor beantwortet haben, können Sie erstellen Sie eine neue Instanz auf dem heap entweder über neue oder mit malloc.
Dies ist die interessantere Frage. Der wesentliche (einzige?) Unterschied zwischen
struct
undclass
in c++ ist derStandard-zugriffsspezifizierer. Das ist
struct
defaults, um den öffentlichen Zugang und dieclass
sind standardmäßig privat. Meiner Meinung nach, das ist der Unterschied, dass sollte bestimmen, welche der beiden Sie verwenden. Im Grunde, wenn Benutzer sollen auf die Mitglieder direkt, dann sollte es einstruct
.Wenn, zum Beispiel, haben Sie keine member-Funktionen, so ist offenbar die Absicht ist für die member des Objekts, um direkt zugegriffen werden, und so wäre es eine
struct
. Im Fall eines Objekts, das ist nur eine kleine private Helfer für die Umsetzung Ihrer äußeren Klasse, wie in deinem Beispiel, dann auch wenn es member-Funktionen ist es oft am deutlichsten zu ermöglichen, die äußeren Klasse zugreifen, um seine Mitglieder-und so sollte es einstruct
. Oft mit diesen Klassen die Implementierung der äußeren Klasse ist eng gekoppelt an die Umsetzung der inneren Klassen und so gibt es keinen Grund zu verstecken das eine vom anderen.So, für trivial - (z.B. std::pair) Objekte oder solche, deren Einsatz beschränkt ist (wie in einer privaten inneren Klasse) Standard-Zugang zu den Mitgliedern kann eine gute Sache sein, und in diesen Fällen würde ich Sie
structs
.Malloc gut funktioniert:
Nur daran erinnern, um
free()
allesmalloc()
'd unddelete
allesnew
'd....calloc
wird auch einmemset(0)
Selbst wenn Sie nicht, definieren Sie einen Konstruktor, erstellt der compiler einen default ein und so können Sie operator 'new':
AFAIAC, ein struct ist eine Klasse, mit der Ausnahme, dass seine "öffentlichkeit" default Umgekehrt.
new
(das istnew Node()
)). Wenn Sie nicht über eine guten einführenden Büchern zu C++, erwägen.Ja, können Sie es anlegen auf dem heap, ohne die Definition eines Konstruktors.
Können Sie 'malloc' und beim loslassen der memory-Nutzung 'frei'. Sonst gibt es keinen anderen Weg gibt.
Persönlich, wenn ich meine Struktur zu haben, die member-Funktionen I ändern Sie es in eine Klasse. Ich Neige dazu, verwenden Strukturen, wie man einen Datensatz in OCaml.
Ja. Wie Sie sagen, es gibt wirklich keine wichtige Unterschiede zwischen structs und Klassen. Wenn Sie gesagt worden, um eine
struct
werden und es muss mindestens ein Mitglied die Funktion, dann definieren Sie eine member-Funktion.Es ist wirklich keine große Sache.
Aber abgesehen davon, können Sie natürlich auf dem heap allokieren Strukturen ohne Konstruktoren (sonst
malloc
wäre eher sinnlos in C., Dass die Sprache gar nicht haben Konstruktoren)Gegeben
struct S
, können Sie einfach anrufennew S
odernew S()
, je nachdem, welche Art von Initialisierung, die Sie wollen. wenn Sie nicht definieren Sie einen Konstruktor, der compiler macht das für Sie.