2016-08-16 25 views
0

我在C++中不是高級的。假設我有一組類,從A到任何(數字將隨時間增長),使用相同類型的構造函數。假設它看起來像這樣:C++在另一個類中實例化一組具有相同構造函數的類中的類類型變量

class A 
{ 
private: 
    double m_x, m_y; 
public: 
    A(const double &x, double &y, const short &n) { ... }; 
}; 

這些類具有相同的m_x, m_y變量,但他們不同的計算。現在有另一個類,說Bla,誰需要使用的建設者來自前一組類,像這樣:

class Bla 
{ 
private: 
    Class m_class; 
public: 
    Bla(const double &x, const double &y, const double &z, const short &i) 
    { 
     switch (i) 
     { 
     case 1: m_class = A::A(...); break; 
     case 2: m_class = B::B(...); break; 
     ... 
     } 
    } 
}; 

構造函數中的switch (i)選擇根據i組的構造之一。如何使Bla中的Class m_class變量與構造函數中的switch (i)一致?我應該選擇什麼類型的變量,或者如何?

或者,m_class只需要持有來自組中的一個類的m_x, m_y變量,以便進一步處理/計算/等,是否有另一種方法呢?我希望我能夠清楚這一點。

+2

這聽起來像你需要一個工廠功能。 – NathanOliver

+2

而且,首先是一個持有'm_x'和'm_y'的基本公共超類。 – Petr

回答

1

你可以有一個接口類與普通成員變量

class I 
{ 
public: 
    virtual ~I() = default; 
protected: 
    double m_x, m_y; 
}; 

然後從派生的具體類,其中的每一個將填充m_xm_y不同。

class A : public I 
{ 
public: 
    A(const double &x, double &y, const short &n) { ... }; 
}; 

然後你Bla構造基本上扮演一個工廠,使特定類型的I根據您的i參數

class Bla 
{ 
private: 
    std::unique_ptr<I> m_class; 
public: 
    Bla(const double &x, const double &y, const double &z, const short &i) 
    { 
     switch (i) 
     { 
     case 1: m_class = std::unique_ptr<I>(new A(...)); break; 
     case 2: m_class = std::unique_ptr<I>(new B(...)); break; 
     ... 
     } 
    } 
}; 
+0

謝謝你的回答。一個問題,但。我不知道'unique_ptr',我剛讀過它。它說我不必爲它使用'delete',但這是否意味着我可以在運行時動態地使用它,而不會頭疼?清理指針是不是我真的很喜歡... –

+0

我現在看到編輯包括析構函數。我將其標記爲答案。 –

+0

是的,unique_ptr允許你仍然可以獲得多態行爲(即使用一個接口),但你不需要手工刪除任何東西 – CoryKramer

1

您可以從一個共同的類派生的類。例如:

class Test { 
    double Val1, Val2; 
public: 
    Test() {} 
}; 

class A: public Test { 
    /* constructor and class-specific variables only, 
     don't declare Val1 & Val2 here */ 
} 

然後,使m_class指針Testnew實例在switch類。

相關問題