2012-06-26 68 views
1

我有內部對象,其should'nt由客戶機代碼可以使用:類方法VS助洗劑

class InternalA {}; 
class InternalB {}; 

我有公共接口對象A,B,C。在內部,我需要從A構造objetcs InternalA和InternalB,但A和B只能通過指向基類C的指針訪問。我可以使用協變虛擬方法,但是這樣做,我的內部變爲公共,而InternalA和InternalB實際上不是同一基類的兩個子類。 或者我可以做這樣的事情:

class C { 
    // some data 
public: 
    C() {}; 
    // some pure virtual methods and virtual methods 
virtual C *getConcrete(void) const =0; 

}; 

class B : C { 
public: 
    //methods 
    virtual B *getConcrete(void) { return static_cast<B>(this); }; 
}; 

class A : C { 
public: 
    //methods 
    virtual A *getConcrete(void) { return static_cast<A>(this); }; 
}; 

,然後使用內部生成器與A或多態性B法參數。

編輯: 要構建InternalA和InternalB,我可以使用一個這樣的功能/方法:

void somefunction(A *a) { 
    InternalA x(<using a->smthg>); 
    // do stuffs 
}; 
void somefunction(B *b) { 
    InternalB x(using b->smthg>); 
    //do stuffs 

};

你對這個黑客有什麼看法?

+0

而且在哪裏呢'InternalA'或'InternalB '在你的榜樣中發揮作用? – RedX

+0

內部構建器可以從指向對象A或B的指針構建它們。但要構建InternalA或InternalB,我需要具體的類A或B,因爲我需要選擇是否需要選擇具有類A或B的抽象類C,將構建InternalA或InternalB – Enjolras

+0

您對此構建器功能有什麼樣的特徵?建立「A」或「B」對象會得到什麼樣的參數?但恕我直言'getConcrete'的情況下,如果罰款太多事件最終有點笨重。 – RedX

回答

0

我認爲它不可能解決這個問題只使用class C。要構建InternalAInternalB,您需要關於A或B的知識。在構建器定義中,必須定義A或B.所以我認爲你應該使用dynamic_cast。或者如果禁止使用dynamic_cast,則使用虛擬功能實現某種類型的ID。

#include "A.h" 

...... 

InternalA* buildInternalA(const C* c) { 
    const A* a = dynamic_cast<const A*>(c); 
    if (a) 
     return new InternalA(a); 
    return 0; 
} 

但是,在您使用生成器(在其他CPP文件),你不`噸需要定義和B的,只是製造商的聲明:

class InternalA; 
class C; 
InternalA* buildInternalA(const C* c);