2014-07-21 92 views
-2

我有一個包含另一個類作爲成員的類。第二類是抽象類,通過一系列女兒課程中的一種以通常方式具體化。 我不確定最好的方式去構建全部類型的類,當它被構造時,會拋出錯誤,因爲它會嘗試構造一個缺少某些方法定義的類。任何人都可以建議解決這個問題的最佳方法嗎? 乾杯, 傑克包含在具體類中的抽象類

編輯1:類圖:

    Main Class 
         | 
     ------------------------------------ 
     |         | 
Normal Methods/Members    Abstract Class member 
              | 
          ----------------------------- 
          |       | 
        Concrete Class 1   Concrete Class 2 

所以「主類」是我擔心的是當它被調用時,抽象類的成員需要進行具體不知何故建設但我不確定如何做到最好。

+2

你可以發佈你的代碼,讓你的問題更清楚嗎? – NirMH

+0

我無法發佈代碼,因爲它非常笨重。我可以嘗試繪製一個小的類結構圖,儘管 – JMzance

+0

您至少可以發佈您的類結構... – NirMH

回答

0

我不完全確定,如果我完全理解你的意思,但在我看來,你可以使用指針或對抽象類的引用,然後用一個具體的類來初始化它。

喜歡的東西

class MainClass 
{ 
    class AbstractClass 
    { 
    public: 
     virtual void SomeFunction() = 0; 
     ... 
    }; 

    class ConcreteClass : public AbstractClass 
    { 
    public: 
     ConcreteClass() {} 
     void SomeFunction() { ... } 
     ... 
    }; 

    AbstractClass* pAbstractClass; 

public: 
    MainClass() 
     : pAbstractClass(new ConcreteClass) 
    {} 

    virtual ~MainClass() 
    { 
     delete pAbstractPointer; 
    } 

    ... 

    void AnotherFunction() 
    { 
     pAbstractClass->SomeFunction(); 
    } 
}; 

只需創建任何具體類從抽象基類繼承的一個實例,並分配給指針抽象類。

+1

我想你應該警告必須在MainClass的析構函數中調用'delete pAbstractClass',以防使用原始指針:) – Scis

+0

@Scis我只是因爲使用了智能指針而提升了你的答案。 :) –

+0

謝謝我欣賞它^ _ ^ – Scis

1

給出一個抽象類A和兩個實現BCenc應該包括他們,我能想到的兩種解決方案:

第一個具有unique_ptrAenc會是什麼樣子:

struct enc{ 
    unique_ptr<A> a; 
    int x; 
    enc(unique_ptr<A> p): a(std::move(p)), x(0) { 
    }  
}; 

演示here

而我碰巧想到的第二個解決方案,我不確定是一個好主意,但我會爲了多功能性而發佈(或者查明它是否有缺陷,我沒有想到)。萬一A用模板,B一些默認施工的類

template <class T> 
struct enc{ 
    T in; // should be private, I'm just lazy :) 
    A &a; 
    int x; 
    enc(): in(T()), a(in), x(0) { 
    }  
}; 

(假設運算需要某種指針或引用的父類中enc

演示here