2013-06-02 74 views
1

我在課上學習C++,並且正在嘗試使用虛擬創建/克隆函數來返回指向派生對象的指針。C++克隆和創建充當虛擬構造函數?

我發現這個實現,我要建立一個圍繞它http://www.cs.uregina.ca/Links/class-info/210/C++FAQ/virtual-functions.html#[20.5]

我不明白的是如何對返回的指針竟然指向任何相關數據克隆後()或創建()退出了塊?

有沒有更好的方法來解決這個問題,或者是我需要爲每個案例編寫一個函數?

感謝很多

class Shape { 
public: 
    virtual ~Shape() { }     // A virtual destructor 
    virtual void draw() = 0;    // A pure virtual function 
    virtual void move() = 0; 
    // ... 
    virtual Shape* clone() const = 0; // Uses the copy constructor 
    virtual Shape* create() const = 0; // Uses the default constructor 
}; 

class Circle : public Shape { 
public: 
    Circle* clone() const { return new Circle(*this); } 
    Circle* create() const { return new Circle();  } 
    // ... 
}; 
+0

正在創建一個靜態對象一個可行的解決方法或否定所有工作都是OO?對不起,這還是很新的。 – Flexo1515

回答

1

...請問在返回的指針竟然指向任何相關數據克隆後()或創建()退出了塊?

Operator new動態分配內存。該內存在使用delete釋放之前一直有效。 clone()create()都不會「刪除」這些指針,所以這兩個函數都會返回一個有效的指針。

有沒有更好的方法來解決這個問題還是我需要爲每個案例編寫一個函數?

由於多態性此處所使用的假設是用戶與Shape類工作,不知道實際執行的對象(即,它們只能用「界面」工作)的。不知道實際的實現是什麼,就不可能既不創建也不復制對象。

類型已知的唯一位置是實現該接口的類的內部方法(在您的情況下是Circle)。因此,這是您基本知道創建和/或複製對象所需的類型,大小和所有其他必要信息的唯一地方。所以答案基本上是肯定的,你必須爲繼承Shape的每個頂級類實現create()clone()。否則,要麼創建/克隆對象是不可能的,要麼甚至更糟糕 - 您可能會碰到一個object slicing問題。

正在創建一個靜態對象一個可行的解決方法還是否定所有工作都是OO?

我沒有看到如何創建一個靜態對象幫助這裏。靜態對象通常每個作用域都有一個實例。具有create()clone()的全部目的是能夠創建對象的多個實例(默認或一個現有實例的副本)。所以擁有一個靜態實例將無助於實現代碼應該做的事情。

+0

呃,謝謝。由於某種原因,我的思想有點燃燒,我甚至沒有考慮過這是另一種情況下的內存泄漏。非常感謝你。 – Flexo1515

1

克隆()使用完全像往常一樣。 Create()不是真的。你可以通過虛擬調度來展示一個用例嗎?

我經常使用的是靜態成員Create()。這起到了工廠方法的作用。每個班都在地圖上註冊了一些ID和指向這個Create函數的地圖。然後可用於創建知道ID(例如從文件讀取)的適當對象,然後在新實例上調用虛擬函數(即從文件中反序列化內容)。

爲了避免複製粘貼,我使用了一個宏來聲明和實現所有的強制功能。