Wo definieren, in C++ - Klassen member-template-Funktion und funktoren, die instanziert?
Ich habe eine Klasse Foo, die in einer kleinen, eigenständigen Projekt. Es hat eine definition der Klasse Foo.h mit der Implementierung für die Klasse' Mitglied Funktionen in eine Implementierung-Datei Foo.cpp.
Erste Frage, die man die member-Funktionen der Klasse Foo ist eine template-Methode Foo::doSomething(), ist es richtig, dass die Implementierung dieser Methode sollte mit der Deklaration der Funktion Foo.h ?
Den template-parameter, die Foo::doSomething() instanziiert werden mit einer von zwei Funktor Typen - Klasse CalcA und CalcB.
Sollte Ich:
- (A) die Definition und die Implementierung der beiden Klassen Functor alle zusammen in Foo.cpp (wo Sie tatsächlich verwendet werden, durch die Implementierung von anderen Foo member-Funktionen zum Aufruf von Foo::doSomething).
- (B) setzen Sie die definition und die Implementierung der beiden Klassen Functor in Foo.h.
- (C) sollte ich split der definition und Umsetzung der beiden Funktoren über Foo.h und Foo.cpp als wäre man mit einem normalen Klasse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Allgemeine Regel:
Wenn foo::doSomething() wird verwendet, außerhalb foo.cpp (d.h., wenn es öffentliche oder geschützte, in der Regel), muss es gehen in der Kopfzeile.
Wenn nicht, setzen in in der cpp-Datei ist vollkommen ok und sogar eine gute Idee (da hält sich die Unordnung Weg von der header-Datei).
So, wenn die funktoren sind nur in der cpp-Datei, mit allen Mitteln die template-Funktion gibt es auch. Man kann immer umgestalten Dinge, die später, wenn diese änderungen.
private
scheint es ein wenig riskant & stinkt mir noch nicht-komplett-definierte Objekte schweben in verschiedene übersetzungseinheiten.Zuerst müssen Sie verstehen, Vorlagen-Mechanismus. Vorlagen werden nicht kompiliert, Sie werden instanziiert, wenn Sie verwendet werden und dann Ihre Instanziierung erstellt. So muss der compiler den vollständigen template-definition in jedem Modul mit der Vorlage-Funktion, um zu instanziieren Sie zuerst nach dem Parameter, die Sie übergeben habe.
Um Ihr problem zu lösen, gibt es drei Lösungen, aber Sie werden sehen, dass Sie beide zum gleichen Ergebnis führen.
Entweder Sie setzen Ihre ganzen Vorlagen in Ihrem header-Datei innerhalb der definition der Klasse (die wir verwenden, um suffix mit .hxx statt .h, um präzise Sie sind mit Vorlagen, Definitionen):
Oder können Sie externalisieren die definition aus der Klasse, aber immer noch in der header-Datei:
Schließlich, die Sie umsetzen können template-Methoden Körper, die in einer externen Datei (mit dem Präfix".cxx aus dem gleichen Grund). Es enthält Methoden Körper aber nicht include "Foo.hxx". Stattdessen ist es "Foo".hxx" das include "Foo.cxx" nach der definition der Klasse. Auf diese Weise, wenn der compiler löst die #include-Direktive, es findet das ganze template-definition in der gleichen Modul, so dass es zu instanziieren:
Die Wahl zwischen diesen 3 Möglichkeiten zum implementieren von Vorlagen ist eher eine Frage der Lesbarkeit (und der Geschmack).
Zweite und Dritte sind gleichwertig in Bezug auf die generierten code, aber ich möchte lieber nicht verwenden, die cxx Datei-Lösung, denn es führt oft zu dummen Fehler, wenn Sie vergessen, umkehren, gehören.
Darüber hinaus bekannte C++ Bibliotheken wie z.B. STL oder Boost vorschlagen, Ihren code in header-Dateien nur, was ein Zeichen für gutes design. Mithilfe der externen definition innerhalb von Header, Sie klären die definition der Klasse. Sie verhindern auch, dass der compiler automatisch inline-Methoden, die manchmal führen zu schlechten Ergebnissen nach zu Herb Sutter http://www.gotw.ca/gotw/033.htm
Mein Standard wäre die definition der member-Funktion Vorlagen direkt in der .h-Datei, wie hier:
Wenn das ist nicht optimal für einen bestimmten Fall, dann würde ich mehr heroischen Maßnahmen. Beginnend mit
#include
-ing ein .inc-Datei mit der definition, die am Ende der .h-Datei, oder möglicherweise sogar explizite instantiierungen in der .cpp-Dateien dort, wo ich die member-Funktion Vorlagen verwendet werden.Die template-Methode-definition sollte in der Tat werden in der header-Datei der er die Klasse zu der er gehört.
Wie diese:
Oder wie folgt (beachten Sie, dass die template-Methode definition enthalten, können aus separaten Datei nach der Klassendeklaration)
Der rest ist abhängig von dem Stil, den Sie vereinbart und Ihre Bedürfnisse.
Ich würde den Funktor Erklärung (oder sogar die definition, wenn Sie einfach sind) in den header, wenn ich Sie nicht nur in Foo oder wenn Foo hat Sie als class member.