Frage

Ich habe Elementfunktionen innerhalb der Klasse, die sie innerhalb der Klasse mit einem Funktionsprototyp und außerhalb der Klasse gehört programmierter gesehen. Ich habe immer nur die erste Methode programmiert verwenden, aber frage mich, ob es besser ist es die andere oder einfach nur persönliche Präferenz zu benutzen?

War es hilfreich?

Lösung

Unter der Annahme, meinen Sie C ++, es ist immer besser, Funktionen zu definieren außerhalb der Klasse, denn wenn man es in der Klasse setzen, Compiler Inline kann versuchen, was nicht immer erwünscht ist:

  1. Erhöhung der Codegröße (jede Objekt-Datei, die dieser Header mit einer Kopie der Funktion in ihrem Code könnte am Ende enthält).
  2. Breaking Binärkompatibilität wenn Funktionsdefinition ändert.

Auch mit Inline-Funktionen ist es in der Regel bessere Definitionen außerhalb der Klasse zu setzen Lesbarkeit der Klasse öffentlichen Schnittstelle zu verbessern, es wäre denn, die Funktion eine triviale Accessor oder ein anderer Einzeiler ist.

Andere Tipps

Für C ++ Methodendefinitionen in der Header-Datei setzen bedeutet, dass alles, was einen gegebenen Header enthält müssen, wenn die Header-Änderungen neu kompiliert werden - auch wenn es nur eine Implementierung Detail.

Definitionen aus dem Header Verschieben bedeutet, dass Dateien, die den Header enthalten müssen nur neu kompiliert werden, wenn der Header selbst ändert (Funktionen hinzugefügt / entfernt oder Erklärungen geändert). Dies kann einen großen Einfluss auf Kompilierungszeiten für komplexe Projekte.

Es gibt Vorteile für beide Techniken.

Wenn Sie nur Prototypen in der Klassendefinition platzieren, das macht es einfacher für jemanden, der Ihre Klasse verwendet, um zu sehen, welche Methoden zur Verfügung stehen. Sie werden nicht von Implementierungsdetails abgelenkt.

Setzen Sie den Code direkt in der Klassendefinition macht es einfacher, die Klasse zu verwenden, müssen Sie nur einen Header # include haben. Dies ist besonders nützlich (erforderlich) mit Templat-Klassen.

Vorausgesetzt, die Sprache ist C ++:

Das Endergebnis ist, dass persönliche Präferenz ist. Innerhalb der Klasse ist insgesamt kürzer und direkter, insbesondere für die

int getFoo() const { return _foo; }

Art der Funktion. Außerhalb te Klasse kann „Unordnung“ aus der Klassendefinition entfernen.

Ich habe gesehen, sowohl im Einsatz ...

Natürlich nicht inlined Funktionen sind immer außerhalb der Klasse.

Es ist auch üblich, beiden Stile zu mischen, wenn eine Klasse zu definieren. Für einfache Verfahren, bestehend aus 1 oder 2 Zeilen ist es üblich und bequem, das Verfahren Körper innerhalb der Klassendefinition zu definieren. Für weiteres langwieriges Verfahren ist es besser, diese nach außen zu definieren. Sie werden besser lesbar Klassendefinitionen haben, ohne sie sich mit der Methode Körper unübersichtlich.

Ausblenden der Implementierung eines Verfahrens ist von Vorteil, dass der Benutzer der Klasse nicht von der tatsächlichen Implementierung abgelenkt werden, oder Annahmen über die Umsetzung machen, die zu einem späteren Zeitpunkt ändern kann.

Ich nehme an, Sie sprechen von C ++.

eine schöne und saubere Schnittstelle zu haben, ist sicherlich eine gute Idee. eine separate Implementierung-Datei haben, hilft Ihre Schnittstelle sauber zu halten.

Es reduziert auch Kompilierung Zeit, vor allem, wenn Sie einen opaken Zeiger .

Wenn Sie die Funktion innerhalb der Klasse implementieren, können Sie die Klasse in mehr CPP-Dateien # include oder der Linker über mehrere Definitionen der Funktion beschweren.

So übliche Praxis ist die Klassendefinition in einer .h-Datei zu haben und die Mitglieder Implementierung in einer CPP-Datei (in der Regel mit dem gleichen Namen).

Auch hier assiming C ++, ich dies in der Regel beschränken auf virtuelle Funktionen Platzhalter, z.

virtual int MyFunc() {}  // Does nothing in base class, override if needed

Alles andere, und Andrew Medico Punkt Tritte zu leicht in und weh tut mal kompilieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top