2015-09-03 47 views
0

我想從我的C++課程做練習,但我無法解決這個問題。任務是編寫合適的類與主要工作(給定和只讀)如何用這個親屬構造對象

int main() { 
    Polygon p1 = Polygon::fromLowerLeftToUpperRight(10, 10, 20, 20); 
    Polygon p2 = Polygon::fromLowerLeftAndSize(10, 10, 20, 20); 
    p1 = Polygon::fromLowerLeftAndSize(10, 10, 10, 10); 
    ... 
} 

多邊形是類。我不知道如何使用「fromLowerLeftToUpperRight」方法而不是構造函數。

+0

閱讀關於靜態成員和靜態成員函數。 –

回答

3

fromLowerLeftToUpperRight將基本上是一個static函數返回一個Polygon對象。事情是這樣的:

class Polygon { 

    public: 
     static Polygon fromLowerLeftToUpperRight(int, int, int, int); 
     static Polygon fromLowerLeftAndSize(int, int, int, int); 
     ...  

    private: 
     Polygon::Polygon(int, int, int, int); 
     ... 
} 

在這些類型的工廠模式,構造一般是保密的,這樣創建對象只能使用這些函數來完成。只有那些可以調用構造函數的函數。

+0

這是使構造函數保密的好機會。 –

1

有你需要知道兩件事情:

首先,任何常見的功能可能會返回一個對象,只要對象有一個可調用拷貝構造函數。所以,如果我有一些MyClass類,我可以創建返回它的實例一個普通的功能:

MyClass create_instance(int val) { 
{ 
    MyClass inst(val + 42); // Call a constructor 

    // Maybe do something else: 
    // ... 

    return inst; // Return a copy of the object created. 
} 

所以這個解決而不直接使用構造函數創建對象的問題:在這種情況下,只需調用create_instance()並採取回報。其次,沒有實例調用的函數(如ClassName::function_name();而不是object.function_name();)是靜態成員函數,它們與普通函數不同的唯一方法是它們可以訪問該類的對象的私有和受保護成員,像普通的會員功能一樣。

所以你需要做的就是創建一個函數來實例化並返回一個Polygon,這也是一個靜態成員函數Polygon