2009-09-29 5 views
0

Je souhaite supprimer une classe dérivée 2 niveaux avec une fonction et mettre son handle à null. Un morceau de code sera helpfull:Passage d'une référence d'un handle en C++/CLI

ref class bob 
{ 
}; 

ref class bill : public bob 
{ 
}; 

ref class jack : public bill 
{ 
}; 

void DeleteX(bob ^% x) 
{ 
    if(x != nullptr) 
    { 
    delete x; 
    x = nullptr; 
    } 
} 

[STAThreadAttribute] 
int main(array<System::String ^> ^args) 
{ 
    bill^ one = gcnew jack(); 
    DeleteX(one); 
    System::Diagnostics::Trace::Assert(one == nullptr); //Failed 
    return 0; 
} 

Si j'utilise le même type pour ma déclaration et mon argument de fonction, cela fonctionne. Mais je veux utiliser le type du milieu pour ma déclaration et le type supérieur pour l'argument de la fonction. Comment puis-je faire cela s'il vous plaît?

C'est la solution que je l'utilise enfin:

template<class T> 
void DeleteX(T ^% x) 
{ 
    if(x != nullptr) 
    { 
    delete x; 
    x = nullptr; 
    } 
} 

Répondre

1

Il fonctionne pour moi ...

ref class bob 
{ 
}; 

ref class bill : public bob 
{ 
}; 

void DeleteX(bob ^% x) 
{ 
    if(x != nullptr) 
    { 
    delete x; 
    x = nullptr; 
    } 
} 

[STAThreadAttribute] 
int main(array<System::String ^> ^args) 
{ 
    bob^ one = gcnew bill(); 
    DeleteX(one); 
    System::Diagnostics::Trace::Assert(one == nullptr); //did not trigger 
+0

Je viens d'essayer votre petit exemple et cela fonctionne pour moi aussi. Mais cela ne fonctionne pas pour mon code complet. J'ai cherché où est la différence et c'est dans une dérivation supplémentaire. J'ai modifié ma question pour inclure cela. Merci. – Jyhess

+0

Étant donné que la fonction attend un 'bob', et que vous lui transmettez une 'facture', elle doit envoyer la facture à un objet temporaire. L'objet temporaire est défini sur null par la fonction, mais cela n'affecte pas l'objet de facture d'origine. Wow, si ce braindump fait sens, je serais très surpris :) – demoncodemonkey

+0

Oui, je suis arrivé à la même conclusion. Pour contourner ce problème, je templetize la fonction DeleteX: template void DeleteX (T ^% x) Je vais ajouter cette solution à la fin de la question pour une meilleure visibilité. Merci pour votre aide. – Jyhess

Questions connexes