【问题标题】:how to make managed wrapper class use the properties of another managed wrapper class?如何使托管包装类使用另一个托管包装类的属性?
【发布时间】:2011-08-10 01:45:03
【问题描述】:

这个想法是我想重用代码而不是复制它。下面,UnManagedB 派生自 UnmanagedA。这两个结构都有其相应的托管包装器,如下所示。我想从 ManagedA 派生 ManagedB,以便我可以将 ManagedA 中的属性重用于 ManagedB。问题是两个类都有自己的指向非托管对象的指针。派生中的非托管对象就是我想要的,我希望所有属性都使用 UnManagedB 指针。有没有办法做到这一点?

struct UnManagedA {
   unsigned int size;
};

struct UnManagedB:UnManagedA {
    int length;
    int width;
};

public ref class A : public System::IDisposable {
public:
    A();
    !A();
    ~A();

    property  System::UInt32 Size {
        System::UInt32 get();
        void set(System::UInt32 value);
    }
internal:
    UnmanagedA* GetUnmanaged() { return obj1; }
private:
    UnmanagedA* obj1;
};

public ref class B : public System::IDisposable, public A {
public:
    B();
    !B();
    ~B();

    property System::UInt32 Length {
        System::UInt32 get();
        void set(System::UInt32 value);
    }

    property System::UInt32 Width {
        System::UInt32 get();
        void set(System::UInt32 value);
    }
internal:
    UnmanagedB* GetUnmanaged() { return obj2; }
private:
    UnmanagedB* obj2;
};

【问题讨论】:

  • 实际问题是什么?副本在哪里?我在这里没有看到重复...
  • 我所写的是我理想中想要的,但这是不可能的,因为基类和派生类都有自己的指向非托管对象的指针。
  • 什么是“不可能的”。派生和基类有自己的指针有什么问题?

标签: visual-c++ c++-cli mixed-mode


【解决方案1】:

虽然它们都有自己的指向非托管对象的指针,但大概这些指针指向完全相同非托管对象——所以应该没有问题。如果您不同意描述无法正常工作的特定使用场景,那么我们可以提供更好的帮助。

【讨论】:

  • 问题出在销毁过程中。每个类的一次性方法都将被调用,并且每个都将尝试删除该对象。这些类中的每一个都可以用作独立类,因此它们需要删除其成员指针。所以需要有一种方法来区分指针是由派生的 vs 类本身创建的指针设置的时间。
  • 总是有only基类删除指针。创建派生类时,它应该调用基类构造函数并传递相同的指针。派生类不应该删除它的指针,因为它知道基类会调用 delete。
  • @Sriram, @Matt:请注意,Matt 建议让基本包装器删除指针,要求非托管类具有虚拟析构函数。另一种选择是派生类删除指针,然后让基类知道。一种可能的方法是将指针保护而不是私有,然后派生类可以将其设置为nullptr(删除nullptr 是合法的并且没有效果)。
猜你喜欢
  • 2011-04-27
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2015-10-17
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多