【问题标题】:Passing a reference of an handle in C++/CLI在 C++/CLI 中传递句柄的引用
【发布时间】:2009-09-29 14:04:02
【问题描述】:

我想删除一个带有函数的 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;
}

如果我的声明和函数参数使用相同的类型,它就可以工作。 但我想在声明中使用中间类型,在函数参数中使用上层类型。 请问我该怎么做?

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

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

【问题讨论】:

    标签: reference c++-cli handle


    【解决方案1】:

    它只适合我......

    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
    

    【讨论】:

    • 我刚刚尝试了你的小例子,它也适用于我。但它不适用于我的完整代码。我搜索了差异在哪里,它是一个额外的推导。我修改了我的问题以包含它。谢谢。
    • 因为该函数需要一个'bob',而你传递给它一个'bill',它必须将bill 转换为一个临时的bob 对象。临时对象被函数设置为空,但这不会影响原始账单对象。哇,如果这个脑残有任何意义,我会非常惊讶:)
    • 是的,我得出了同样的结论。为了绕过这个问题,我将函数 DeleteX 模板化: template void DeleteX( T ^% x ) 我将在问题的末尾添加这个解决方案以获得更好的可见性。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多