Ho un tipo di "PC" (cioè un personal computer) che ho bisogno di modellare in C ++ (posso usare standard di linguaggio nuovi come C++11
, ma non più recente di quello). In breve, abbiamo un sacco di granularità per i componenti nel PC (nel mio strumento attuale, sarebbe circa 10 volte il numero di componenti mostrati qui), cioè:
Tower
Motherboard
CPU
CORE1
CORE2
CORE3
CORE4
RAM_BANK
DIMM1
DIMM2
DIMM3
DIMM4
SATA_Controller
Drive1
Drive2
Drive3
PCIE_BUS
VideoCard1
VGA_OUT
HDMI_OUT
DVI_OUT
VideoCard2
VGA_OUT
HDMI_OUT
Power_Button
Vorrei impostare una classe base comune per tutti gli oggetti nella struttura sopra in modo da poter scorrere tutti gli oggetti che usano questa classe base comune. Idealmente, mi piacerebbe essere in grado di stampare l'albero ereditario sopra mostrato, nel modo più pulito possibile. Questo perché potrei dover supportare migliaia di "PC" diversi con diversi tipi di schede madri, controller del disco, tipi di CPU; alcuni modelli potrebbero avere componenti che altri non hanno, ecc.
Oltre a essere in grado di generare l'albero mostrato sopra, in modo generalizzato, ho una logica di rilevamento dei componenti che deve essere implementata. Ad esempio, la classe motherboard
, dopo aver rilevato una versione specifica di una classe CPU
, utilizzerà un'interfaccia specifica per comunicare con tale istanza di quella particolare versione della classe CPU
, ad es. "La scheda madre ha rilevato una CPU AMD64, versione / modello XYZ, usa questa interfaccia per parlarci". L'obiettivo finale è un modo riutilizzabile per assemblare "PC" virtuali e assegnare automaticamente l'interfaccia appropriata affinché un genitore possa comunicare in modo bidirezionale con un oggetto figlio.
Quale modello di progettazione dovrei prendere in considerazione per una tale implementazione? Stavo pensando ad una semplice classe base comune (cioè la classe widget
) che tutte le altre classi ereditano. Quindi, la classe widget ha un tipo di dati astratto (elenco) che contiene un riferimento / puntatore a tutti gli altri membri di quella classe che ereditano anche dalla classe gen di widget
. Tuttavia, non riesco a trovare un metodo per aggiungere automaticamente tutte le classi child %_de% -type all'elenco. Ad esempio:
class widget {
private:
std::list<widget> children;
protected:
char name[256];
public:
void announce()
{ printf("Component name:%s.", this->name);}
};
class MotherBoard: public widget {
private:
CPU cpu1;
CPU cpu2;
RAM_bank rambank1;
public:
MotherBoard() {
// Add all classes that derive from widget to this list.
// i.e. cpu1, cpu2, rambank1.
// Also, construct 'cpu1' with a generic interface that
// accepts 2 parameters: this.name (for this particular
// MotherBoard instantiation) and this->cpu1.name;
}
};
class CPU: public widget {
public:
CORE core1;
CORE core2;
CORE core3;
CORE core4;
};
class RAM_BANK: public widget {
public:
DIMM dimm1;
DIMM dimm2;
DIMM dimm3;
DIMM dimm4;
};
Infine , lo stesso widget
supporta l'introspection abbastanza per essere in grado di rilevare automaticamente tutti i membri che derivano da una classe specifica e aggiungerli alla lista C++
? Questo è così che se un nuovo componente che eredita da children
viene aggiunto come membro alla classe, le persone non possono dimenticare di averlo incluso nell'elenco widget
.
Grazie.