Ich versuche, ein Stück Code zu entwerfen, die die Verwendung eines Algorithmus erfordert. Der Algorithmus sollte in Zukunft leicht durch jemand anderes ersetzt werden können. Also in meinem LargeClass muss es eine Möglichkeit geben, einen bestimmten Algorithmus aufzurufen.Verwenden einer Interface-Klasse als Mitglied Typ in einer anderen Klasse
Ich habe einen Beispielcode unten zur Verfügung gestellt. Meine Idee war, eine Interface-Klasse IAlgorithm zu machen, so dass Sie selbst eine Implementierung bereitstellen müssen. Ich dachte, dass Sie es im Konstruktor der LargeClass zu welcher jemals abgeleiteten Klasse initialisieren konnten. Allerdings kompiliert der folgende Code in VS2015 nicht, weil IAlgorithm: cannot instantiate abstract class
Meine Frage: Wie soll ich das entwerfen, um das gewünschte Ergebnis zu erhalten?
Vielen Dank im Voraus!
Algorithm.h
class IAlgorithm
{
protected:
virtual int Algorithm(int, int) = 0;
};
class algo1 : public IAlgorithm
{
public:
virtual int Algorithm(int, int);
};
class algo2 : public IAlgorithm
{
public:
virtual int Algorithm(int, int);
};
Algorithm.cpp
#include "Algorithm.h"
int algo1::Algorithm(const int a, const int b)
{
// Do something
}
int algo2::Algorithm(const int a, const int b)
{
// Do something
}
Source.cpp
#include "Algorithm.h"
class LargeClass
{
private:
IAlgorithm algo;
};
int main()
{
}
Verwenden eine Referenz oder einen Zeiger für das Element. –
"Wie soll ich das gestalten, um das gewünschte Ergebnis zu erhalten?" - Die Frage ist, welches Ergebnis willst du wirklich? Ich meine, Sie haben sich entschieden, einen polymorphen Algorithmus zu verwenden, aber warum? Was ist das Endergebnis, nach dem wir suchen? Ich frage das, weil polymorphe Schnittstellen oft unflexibel sind und weitgehend zugunsten von Lambdas, Verschlüssen und Templates veraltet sind. –
Sie haben nicht genug darüber nachgedacht, wie Sie die * spezifische * Implementierung der Schnittstelle erstellen und zerstören werden. Sie bitten den Compiler, es für Sie zu tun, und es beschwert sich richtig, dass es nicht weiß, wie das zu tun ist. Im Moment hat Ihr Code kein Orakel, das Ihnen die Antwort gibt. –