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;
}
}
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
É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
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