我有3個班B
,C
,D
,從一個基類A
得出:廠功能 - 如何做到這一點的更好的方式
class A
{
// body
};
class B : public A
{
// body
};
class C : public A
{
// body
};
class D : public A
{
// body
};
我想創建一個工廠功能,可以讓我創建特定類型(B
,C
或D
)的對象,併爲返回一個指向它A
類:
typedef std::shared_ptr<A> a_ptr;
a_ptr createObject(int type)
{
switch(type)
{
case 0:
return a_ptr(new B());
break;
case 1:
return a_ptr(new C());
break;
case 2:
return a_ptr(new D());
break;
}
}
然後,如果我有例如B
類型的指針,我想將工廠創建的對象指定給B
。對我而言,唯一合理的解決方案是:
std::shared_ptr<B> b = std::shared_ptr<B>(dynamic_cast<B*>(createObject(0)));
但它看起來很醜。有沒有更好的解決方案?或者,也許我應該嘗試用我的函數創建對象的不同方式?
如果您基於運行時值創建對象(這裏是'int type'),那麼就沒有可能返回值被「正確」鍵入(如果'createObject'是一個模板,這將是可能的,但然後你只能夠靜態創建),所以需要強制轉換。你可以設計*隱藏它的方式,但恕我直言,這不是一個好主意。演員應該是突出的。 – Jon 2013-03-07 13:14:50
C++是靜態類型的。也就是說,你必須在編譯時知道每個表達式的類型。 (在你的情況下,應該是'A'類型。) – 2013-03-07 13:15:59
請注意,'shared_ptr's有自己的[cast methods](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast)。 – 2013-03-07 13:18:04