2011-04-21 29 views
1

这个想法是,我想重用代码,而不是重复它。下面,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; 
}; 
+0

和实际的问题是什么?重复在哪里?我在这里看到没有重复... – 2011-04-21 07:29:32

+0

我写的是我想要的,但它不可能,因为基地和派生有他们自己的指向非托管对象。 – 2011-04-21 07:47:48

+0

什么是“不可能的”。派生和基地有自己的指针有什么问题? – 2011-04-21 21:25:15

回答

0

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

+0

问题在于销毁。每个类的一次性方法都会被调用,并且每个类都会尝试删除该对象。每个类都可以作为独立类使用,因此他们需要删除它们的成员指针。所以需要有一种方法来区分何时指针由类本身创建的派生vs指针设置。 – 2011-04-21 21:31:47

+0

总是只有*基类删除指针。当你创建派生类时,它应该调用基类的构造函数并通过相同的指针。派生类不应该删除它的指针,因为它知道基类将调用delete。 – 2011-04-22 01:55:52

+0

@Sriram,@Matt:请注意,让基础包装器删除指针的马特建议要求非托管类具有虚拟析构函数。另一种选择是让派生类删除指针,然后让基类知道。一种可能的方式是将指针保护而不是私有,然后派生类可以将其设置为'nullptr'(删除'nullptr'是合法的,并且不起作用)。 – 2011-04-22 04:01:51

相关问题