ich mit Polymorphismus am Experimentieren und boost :: Variante in C++ 11boost :: variant und Polymorphismus in C++ 11
Hier ist der Code
#include <iostream>
#include <boost/variant.hpp>
using namespace std;
class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{
width=a;
height=b;
}
};
class Rectangle: public Polygon {
public:
Rectangle() {
std::cout << "ctor rectangle" << std::endl;
}
int area()
{
return width*height;
}
};
class Triangle: public Polygon {
public:
Triangle() {
std::cout << "ctor triangle" << std::endl;
}
int area()
{
return width*height/2;
}
};
int main() {
Triangle r;
boost::variant<Rectangle, Triangle> container = r;
int x = 4;
int y = 5;
if (container.type() == typeid(Rectangle)) {
r.set_values(x,y);
std::cout << r.area() << std::endl;
} else if (container.type() == typeid(Triangle)){
r.set_values(x,y);
std::cout << r.area() << std::endl;
}
return 0;
}
Ich frage mich, ob dies der beste Weg, um fortzufahren. Es gibt eine Wiederholung im Code (in der main() -Funktion), wo wir für jeden Typ (wir erhalten den Typ zur Laufzeit) dasselbe ausführen, dh den Wert einstellen und den Bereich drucken.
Gibt es einen besseren Weg, dies zu tun?
Warum fügen Sie nicht 'virtual int area()' in 'Polygon' ein? Ich sehe keinen Bedarf für "Variante" hier; regulärer Polymorphismus würde in diesem Beispiel gut funktionieren. – 0x5453
Auch RTTI ist generell eine schlechte Idee und sollte bei Verwendung von 'variant' nicht benötigt werden. Sie möchten stattdessen einen Besucher verwenden. – 0x5453
Wenn die Frage ist, "wie Wiederholung im Code zu beseitigen", scheint die Frage in Ordnung. Aber Ihre abschließende Aussage sagt "Gibt es einen besseren Weg, dies zu tun?", Die zu weit/unklar ist. Wenn du meinst "Wie rufe ich eine Methode einer' boost :: variant' "auf, ist es auch in Ordnung (ohne Duplikate).Sei klar über deine Frage –