Sto provando a confrontare gli oggetti di una classe base comune insieme. Il confronto dovrebbe fallire (in uscita una stringa di errore, ad esempio) in ogni caso quando i due oggetti differiscono in classe, o differiscono in valori specifici per l'oggetto. Idealmente il confronto è in qualche modo applicato, così che una nuova classe derivata dovrebbe anche scrivere una funzione di confronto per i membri della sua classe. Ecco un esempio di codice:Confronto di classi derivate in C++ senza fusione dinamica o downcast statico
#include <iostream>
#include <string>
#include <vector>
class Vehicle
{
public:
virtual std::string compareTo(Vehicle* v) = 0;
};
class Bicycle : public Vehicle
{
public:
Bicycle() { color_ = "red"; }
std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
std::string compareTo(Bicycle* b) { return color_.compare(b->color_) ? "We're different bicycles." : "We're the same bicycle."; }
private:
std::string color_;
};
class Car : public Vehicle
{
public:
Car() { style_ = "sedan"; }
std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
std::string compareTo(Car* c) { return style_.compare(c->style_) ? "We're different cars." : "We're the same car."; }
private:
std::string style_;
};
int main()
{
Vehicle* compareFrom = new Bicycle();
std::vector<Vehicle*> compareTos;
compareTos.push_back(new Bicycle());
compareTos.push_back(new Car());
std::vector<Vehicle*>::iterator it;
for (it = compareTos.begin(); it != compareTos.end(); ++it)
std::cout << compareFrom->compareTo(*it) << std::endl;
return 0;
}
Attualmente, l'uscita (che potete vedere here) dice: "Siamo diversi veicoli". So che questo sta accadendo perché sto usando il puntatore di base astratto. Il problema è come risolverlo!
L'output che avrei come da avere è che le biciclette emettono che sono uguali, perché hanno lo stesso colore. Le biciclette e le auto dovrebbero produrre che sono veicoli diversi. Anche le biciclette di diversi colori e le auto di stili diversi devono mostrare che sono diverse. Mi sembra che ci debba essere un ottimo schema da utilizzare per risolvere questo problema, ma mi sto impantanando nel casting dinamico o in problemi di downcast non sicuri. Inoltre, vorrei che la funzione di confronto fosse applicata tra membri della stessa classe (quindi le biciclette devono essere in grado di confrontarsi con altre biciclette).
Mi dispiace, nota che string.compare() restituisce 0 quando le stringhe corrispondono. –
Perché ti consideri 'impantanato' nel casting dinamico? – Macke
@Macke Da quello che ho letto, il casting dinamico non dovrebbe essere necessario in una "corretta" progettazione orientata agli oggetti. Dal momento che sto facendo questo progetto da zero, volevo farlo bene! – aardvarkk