J'apprends le C++ et je suis coincé avec un problème. J'ai besoin d'un moyen d'utiliser une sous-classe spécifique dans la classe de base. Est-ce logique ou j'utilise une mauvaise approche? SelectBrand devrait sélectionner la sous-classe, comment puis-je le faire?Sélectionner la sous-classe à partir de la classe de base ... possible?
Ci-dessous mes classes simplifiées:
-----
class Protocol {
public:
Protocol() {};
~Protocol() {};
int openPort();
int readPort(char *buffer);
.....
private:
Protocol (const Protocol&);
};
int Protocol::openPort() {......};
int Protocol::readPort() {.........};
/***********************************************************************************/
class Device{
public:
Device(Protocol& port):_protocol(port){}
~Device();
virtual int getEvent(char *buffer) { return -1; }
int Device::selectBrand();
..............
protected:
Protocol& _protocol;
private:
int brand;
Device(const Device&orig);
};
Device::~Device() {}
int Device::selectBrand() {
......
switch (X)
case 1:
"use subclass Brand_B"
case 2:
"use subclass Brand_B"
.......
}
/***********************************************************************************/
class Brand_A:public Device {
public:
Brand_A(Protocol& port);
~Brand_A();
int getEvent(void *rawData);
private:
Brand_A(const Brand_A&);
};
Brand_A::Brand_A(Protocol& port):Device(port) {}
Brand_A::~Brand_A() {}
int Brand_A::getEvent(void *rawData) {
.... readPort(......);
}
/***********************************************************************************/
class Brand_B:public Device {
public:
Brand_B(Protocol& port);
~Brand_B();
int getEvent(void *rawData);
private:
Brand_B(const Brand_B&);
};
Brand_B::Brand_B(Protocol& port):Device(port) {}
Brand_B::~Brand_B() {}
int Brand_B::getEvent(void *rawData) {
.... readPort(......);
}
/* main **********************************************************/
int main(int argc, char **argv) {
Device *mydev;
char *buffer;
..............
mydev->selectBrand();
..........
mydev->getEvent(buffer);
...........
}
Il y a beaucoup trop de sections '....' dans votre exemple. Ce que 'selectBrand' fait réellement n'est pas clair: qu'est ce que' X' et que voulez-vous dire par "utiliser la sous-classe"? – casablanca
Si en "sélectionnant" vous projetez de baisser un objet pour "obtenir" une sous-classe, alors oui, votre approche est erronée. Je pense que fournir autant de code est déroutant - que diriez-vous juste les classes clés, les méthodes et comment vous voulez les utiliser? – belwood
'~ Device()' devrait probablement être 'virtual'. – fredoverflow