2010-12-04 4 views
0

J'ai une classe set qui peut contenir et gérer de manière polymorphique n'importe quoi de type Multinumber. Cela peut être un objet de type Pair, Rational ou Complex. Le problème que je rencontre est que cette classe nécessite une gestion dynamique de la mémoire et dans de nombreux cas, comme la fonction ci-dessous, je ne sais pas quel type allouer. Comme l'ensemble est de type agnostique, je ne peux pas savoir si je suis supposé faire Multinumber * var = new Complex, Rational, ou Pair. Est-il possible de vérifier le type de ce que j'ajoute en premier, ou de stocker cette information dans un autre type de données sans l'effet de découpage? Une fonction où j'ai ce problème est le suivant:Comment allouer dynamiquement de la mémoire à un type de données polymorphique?

bool Set::addElement(Multinumber* newElement) 
{ 
    bool success = false; 
    if(isFull()) 
    { 
     resize(); 
    } 
    if(!isMember(newElement)) 
    { 
     setArray[numElements] = newElement; 
     numElements++; 
     success = true; 
    } 
    return success; 
} 

EDIT: Je parle de situations où cela est le ne place que je pourrais peut-être allouer, par exemple lorsqu'un opérateur + est appelé et doit immédiatement envoyer le objet ici, et la classe appelante ne sait pas quel est le type. Cela se passe dans mon code dans le Set + operator overload, puisque le Set ne sait pas ce qu'il stocke.

+1

Vous semblez stocker des * pointeurs * dans 'setArray', ce qui est bien. Quel est le problème que vous rencontrez? –

Répondre

1

Je ne vois pas pourquoi vous alloueriez ici. Mais à part cela, utilisez l'idiome virtual clone.

+0

A travaillé parfaitement! Merci! –

1

Vous pouvez utiliser le typeid opérateur pour vérifier le type de classe réelle de newElement comme ci-dessous:

if (typeid(*newElement) == typeid(Complex)) 
{ 
    setArray[numElements] = new Complex; 
    // anything else 
} 

setArray doit être un tableau de Multinumber *.

+0

Non autorisé à utiliser typeid pour l'affectation –

+0

setArray est un tableau de type Multinumber *. –

+0

Pourquoi ne pas utiliser tp useid, Ross? – Exia

Questions connexes