2010-09-30 16 views
0

Il existe une fonction membre dans laquelle je voudrais supprimer l'objet courant et créer un tableau de nouveaux à sa place. Comment est-ce possible? Le code suivant est une tentative de la mienne qui a beaucoup d'erreurs.Supprimer l'objet actuel et créer un tableau de nouveaux

void LernaeanHydra::split(int parts) 
{ 
    LernaeanHydra *new_heads = new LernaeanHydra[parts]; 
    for (int i = 0; i < parts; i++) { 
     std::vector<LernaeanHydra *> child123; 
     for (int j = i * parts; j < (i + 1) * parts; j++) { 
      child123[j] = children[i * parts + j]; 
     } 
     new_heads[i] = LernaeanHydra(child123, num_children/parts); 
    } 

    delete this; 
} 

J'ai lu que nous le destructor et nous ne devrions pas tenter une delete this ne devrait jamais appeler explicitement.

+0

Vous ne pouvez pas remplacer un objet scalaire par un ensemble d'objets sur place. Peut-être pouvez-vous prendre du recul et expliquer l'image plus large de ce que vous essayez de faire. –

+0

J'essaie de diviser un nœud dans un arbre, ce qui signifie créer de nouveaux nœuds à sa place qui partagent ses éléments. –

Répondre

2

Lorsque vous partagez un nœud dans un arbre, vous devriez normalement commencer avec un nœud contenant un vecteur de pointeurs vers ses nœuds enfants. Vous devez ensuite créer un nouveau nœud contenant un vecteur de pointeurs vers ses nœuds enfants que vous avez initialisés avec la moitié des pointeurs enfants du nœud actuel. Ensuite, vous effacez ces pointeurs du nœud actuel - mais vous ne le détruisez certainement pas (même après avoir "donné" la moitié de ses données, il conserve une quantité raisonnable que vous ne voulez pas jeter).

class Node { 
    // for the moment I'm ignoring the keys, though they'd also be needed for any 
    // of this to accomplish much. 
    std:vector<Node *> children; 
    typedef std::vector<Node *>::iterator child_it; 
public: 
    Node(child_it begin, child_it end) : children(begin, end) {} 

    Node *split() { 
     size_t center = children.size()/2; 

     Node *new_node = new Node(children.begin()+center, children.end()); 
     children.erase(children.begin() + center, children.end()); 
     return new_node; 
    } 
}; 

Notez que dans C++ 0x, vous auriez probablement à déplacer les pointeurs au lieu de copier détruire ensuite les originaux (mais étant donné qu'ils sont des pointeurs, il ne sera probablement pas faire une réelle différence). Notez également que ceci devrait être exceptionnellement sûr - si l'allocation/l'initialisation du nouveau nœud échoue, le throw empêchera l'exécution de children.erase, de sorte que le nœud restera tel qu'il était auparavant. Nous effaçons seulement les pointeurs supplémentaires après que nous ayons assuré que la création du nouveau noeud et la copie de celui-ci a réussi.

1

Peut-être vous avez besoin d'un nœud factice qui est initialisé avec un membre de votre noeud, il peut gérer la fonction split correctement:

Class Node { 
public: 
    Node() { 
    obj = new Obj(); 
    issplit = false; 
    } 
    ~Node() { 
    if (issplit) delete [] obj; else delete obj; 
    } 
    void split(int p) { 
    if (!issplit) { 
     delete obj; 
     obj = new Obj[p]; 
    } 
    } 
private: 
    Obj* obj; 
    bool issplit; 
}