Je me demande s'il est possible d'avoir une classe qui utilise un template<typename T>
avec des fonctions que le 'typename T' utilise par défaut. Je vais vous donner des exemples:Comment avoir deux (ou plus) instances d'un template typename class utilise la même fonction
tête:
includes all here
extern template class Object<rectangleBase>
extern template class Object(circleBase>
struct rectangleBase
{
int width, height;
int posX, posY;
};
struct circleBase
{
int radius;
int posX, posY;
};
template<typename T>
class Object {
public:
Object();
~Object();
void movePos(int x, int y);
void setPos(int x, int y);
T& returnObject() {
return object;
}
private:
T object;
};
Source:
includes all here
template class Object<rectangleBase>
template class Object<circleBase>
Object<rectangleBase>::Object() {
rectangleBase* newObject;
newObject = new rectangleBase;
object = *newObject;
}
Object<circleBase>::Object() {
circleBase* newObject;
newObject = new circleBase;
object = *newObject;
}
void Object::movePos(int x, int y) { //here
object.posX += x;
object.posY += y;
}
void Object::setPos(int x, int y) { //here
object.posX = x;
object.posY = y;
}
Avec les fonctions setPos et movePos, est-il possible que les deux <rectangleBase>
et <circleBase>
peuvent utiliser la même fonction au lieu de Je dois écrire deux fois le même code parce qu'ils utiliseraient exactement le même code, j'ai montré où les fonctions sont dans le code.
Si ce n'est pas possible, existe-t-il une alternative?
Pourquoi vous spécialisez-vous explicitement votre classe avec exactement le même comportement? – Quentin
Désolé je ne vous suis pas @Quentin – Jack
Je ne comprends pas la question: vous implémentez 'movePos' et' setPos' qu'une seule fois. Ce qui est vraiment inquiétant à propos de votre code, c'est que vous fuyez la mémoire: lorsque vous appelez 'new circleBase' et' new rectangleBase' vous ne libérez jamais cette mémoire. De plus, vous n'avez pas vraiment besoin d'appeler explicitement 'new' car si votre' T' a un constructeur par défaut (ou si vous écrivez une version spécialisée de 'Object()'), 'object' sera toujours initialisé avec un objet vide (en ce moment vous faites également une copie et l'assigner à 'object'). –