2011-04-21 32 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

相關問題