Reference 在C+中传递句柄的引用+/CLI

Reference 在C+中传递句柄的引用+/CLI,reference,c++-cli,handle,Reference,C++ Cli,Handle,我想删除一个带有函数的2级派生类,并将其句柄设置为null。 一段代码将非常有用: 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

我想删除一个带有函数的2级派生类,并将其句柄设置为null。 一段代码将非常有用:

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;
}
ref类bob
{
};
参考类法案:公共银行
{
};
参考类别:公共法案
{
};
void DeleteX(bob^%x)
{
如果(x!=nullptr)
{
删除x;
x=零PTR;
}
}
[属性]
int main(数组^args)
{
比尔^one=gc新插孔();
DeleteX(一个);
系统::诊断::跟踪::断言(one==nullptr);//失败
返回0;
}
如果我在声明和函数参数中使用相同的类型,它就可以工作。 但是我想使用中间类型作为声明,使用上层类型作为函数参数。 请问我怎么做

这是我最终使用的解决方案:

template<class T>
void DeleteX( T ^% x )
{
  if( x != nullptr )
  {
    delete x;
    x = nullptr;
  }
}
模板
void DeleteX(T^%x)
{
如果(x!=nullptr)
{
删除x;
x=零PTR;
}
}

它只适合我

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
ref类bob
{
};
参考类法案:公共银行
{
};
void DeleteX(bob^%x)
{
如果(x!=nullptr)
{
删除x;
x=零PTR;
}
}
[属性]
int main(数组^args)
{
bob^one=gcnew bill();
DeleteX(一个);
系统::诊断::跟踪::断言(one==nullptr);//未触发

我刚刚尝试了你的小示例,它对我也很有用。但它不适用于我的完整代码。我搜索了差异的位置,它在一个额外的派生中。我修改了我的问题,将其包括在内。谢谢。因为函数需要一个“bob”,而你传递给它一个“bill”,它必须将账单转换为一个临时bob对象。temporary对象被函数设置为null,但是这不会影响原始bill对象。哇,如果braindump有任何意义,我会非常惊讶:)是的,我得出了相同的结论。为了绕过这个问题,我模板化了函数DeleteX:template void DeleteX(T^%x)我将在问题的末尾添加此解决方案,以提高可见性。感谢您的帮助。