In dem Fall, in dem mehrere gewünschte Implementierungen für eine bestimmte Schnittstelle vorhanden sind, aber die gewünschte Implementierung vor der Kompilierungszeit bekannt ist, ist es falsch, die make-Datei einfach auf verschiedene Implementierungsdateien für denselben Header zu verweisen?Ist es in Ordnung, verschiedene Implementierungsdateien zu verwenden, um Polymorphie zu erreichen?
Zum Beispiel, wenn ein Programm definieren, ein Auto (Car.h)
// Car.h
class Car {
public:
string WhatCarAmI();
}
und bei der Erstellung wir wissen, ob wir wollen, dass es ein Ferrari oder ein Fiat sein, die jeweils zu geben, entweder von der entsprechende Dateien:
// Ferrari.cpp
#include "Car.h"
string Car::WhatCarAmI() { return "Ferrari"; }
während für den anderen Fall (wenig überraschend)
// Fiat.cpp
#include "Car.h"
string Car::WhatCarAmI() { return "Fiat"; }
Nun, ich bin mir bewusst, dass ich sowohl Fiat als auch Ferrari abgeleitete Objekte von Car machen konnte und zur Laufzeit auswählen was ich gerne bauen würde. Ähnlich könnte ich es templatisieren und den Compiler dazu bringen, zur Kompilierzeit auszuwählen, was zu erstellen ist. In diesem Fall beziehen sich die beiden Implementierungen jedoch beide auf separate Projekte, die sich niemals überschneiden sollten.
Ist es falsch, zu tun, was ich vorschlage und einfach die richtige .cpp im Makefile für das gegebene Projekt auszuwählen? Was ist der beste Weg, dies zu tun?
Das können Sie ja tun. Das ist ein bisschen eine schlechte Version von [Pimpl Idiom] (https://en.wikibooks.org/wiki/C%2B%2B_Programming/Idioms#Pointer_To_Implementation_.28pImpl.29). –
Da dies ein statischer Polymorphismus ist, ist die Verwendung von CRTP ('class Fiat: public Car ') wahrscheinlich wesentlich idiomatischer als das Austauschen einer cpp-Datei und wird unbedingt benötigt, wenn mehrere Schnittstellen nebeneinander existieren sollen. –
Sie könnten, aber Sie sollten nicht. Das ist ein ziemlich schlechter Weg Polymorphie zu erreichen und eine ziemlich schlechte Design-Wahl. – Nico