2010-12-04 4 views
0

J'ai la fonction suivante et une hiérarchie de classes telles que Multinumber est hérité par Pairs, Rational et Complex. Tous partagent des fonctions qui sont virtuelles dans Multinumber. Mon problème est le code suivant. De la façon dont il est écrit maintenant, la variable newElement sort de la portée quand elle est ajoutée à mon setArray qui est de type Multinumber**, et j'ai besoin de trouver un moyen d'allouer de la mémoire dans cette fonction. Bizarrement, les paramètres qui sont passés dans la fonction, même lorsqu'ils sont imprimés sur la première ligne, sont toujours vides quand je fais un cout<<newElement->tostring(); Quelqu'un peut-il me dire ce qui ne va pas ici?Comment allouer de la mémoire dans cette fonction?

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

EDIT: Oui, l'affiche est correcte, cela est un devoir

+0

Nous avons besoin de plus de code. Veuillez poster toute la classe 'Set'. Il serait également utile de voir l'implémentation de 'Multinumber'. –

Répondre

0

Dans le monde réel (je comprends de your previous question que c'est pour les devoirs), vous ne serait pas implémenter votre propre ensemble. La bibliothèque standard fournit cette fonctionnalité (std::set si vous souhaitez conserver les éléments dans l'ordre: std::unordered_set si vous utilisez C++ 0x et/ou avez les extensions appropriées et priorisez la vitesse par rapport aux fonctionnalités supplémentaires).

Vous devriez probablement aussi vous pencher sur certaines classes de pointeurs intelligents.

Cela dit:

Dans votre code, newElement ne va pas hors de portée. Qu'est-ce qui se passe, c'est que vous avez reçu un pointeur sur les données du code appelant, et le code appelant laisse alors la chose pointée hors de la portée.

As I responded Pour votre précédente question, vous devez utiliser le "idiome virtual clone" pour faire la copie.

Fondamentalement, vous voulez appeler new avec quel que soit le type de la chose passée, pointée, de telle sorte qu'une copie est faite. Pour s'assurer que "une copie est faite", la chose naturelle à faire serait d'utiliser le constructeur de copie avec new, c'est new whatever(my_existing_whatever_instance). Mais en C++, les constructeurs ne peuvent pas être virtual, donc nous ne pouvons pas réellement mettre le type désiré dans un appel new. Au lieu de cela, nous devons faire semblant avec une fonction de membre. Puisque les fonctions membres peuvent être virtual, la version correcte clone est recherchée dans la chose pointée réelle, qui est implémentée pour appeler new en utilisant son propre type, et appelant son propre constructeur de copie. Le lien fournit des détails.

1

Pour éviter des problèmes de mémoire remplacent Multinumber** setArray avec std::vector<boost::shared_ptr<Multinumber>> setArray.

0

Si vous en avez besoin pour grandir, créez-le de type vector<Multinumber*> et utilisez setArray.push_back (newElement).

Vous devez vous assurer que l'appelant garde l'élément en vie tant que le vecteur est actif. Sinon, ajoutez peut-être une méthode Clone virtuelle à Multinumber qui renvoie une copie (et les sous-classes l'implémentent). Ensuite, push_back(newElement->Clone()).

+0

Je suppose qu'il veut un ensemble plutôt qu'un vecteur, c'est-à-dire qu'il impose l'invariant qu'il ne peut y avoir qu'un seul de chaque valeur. Je suppose en outre, sur la base des questions précédentes, qu'il est tenu de mettre en œuvre le conteneur pour les devoirs. –

Questions connexes