我有幾個類與幾個named constructors。當我從他們那裏繼承時,我應該如何繼承構造函數?問題是它們返回基類的對象而不是子類的對象。命名構造函數習慣用法和繼承
問題:我可以使用C++ 0x「using」來減少樣板代碼的數量嗎?
我有幾個類與幾個named constructors。當我從他們那裏繼承時,我應該如何繼承構造函數?問題是它們返回基類的對象而不是子類的對象。命名構造函數習慣用法和繼承
問題:我可以使用C++ 0x「using」來減少樣板代碼的數量嗎?
您既不會繼承「經典」構造函數,也不會繼承「命名」構造函數。您應該爲每個派生類創建特定的構造函數。
下面是一個例子,如何命名的構造函數可以繼承使用:
class SpiralPoint: public Point{
private: SpiralPoint(float t, float r)
:Point(Point::polar(r*t, t)) { };
};
struct Foo {
template<typename T> static T one() { return T(1); }
};
struct A { int x; A(int i) : x(i) {}};
struct B : A { B(int i) : A(i) {}};
,它允許你做這樣的事情
A a = Foo::one<A>();
B b = Foo::one<B>();
命名的構造函數是一個成語,它們是不是真實的構造函數。嚴格地說,命名視圖取決於static
函數。繼承需要virtual
函數。現在,非成員不能是虛擬的,因此排除了具有static virtual
功能的想法。
問題:我可以使用C++ 0x「using」來減少樣板代碼的數量嗎?
的using
聲明要求編譯器繼承基類構建函數的全或無。所以,是的,他們可以簡化你的代碼。但是,你所有的編譯器都支持C++ 0x嗎?
我發現(幾乎)完美的解決方案!
template <class T>
class Color {
public:
static T Red () { return T (0); }
static T Green() { return T (1); }
static T Blue () { return T (2); }
protected:
explicit Color (int raw) : raw (raw) {
}
private:
int raw;
};
class MoreColor : public Color <MoreColor> {
public:
static MoreColor Octarina() { return MoreColor(8); }
private:
friend class Color <MoreColor>;
explicit MoreColor (int raw) : Color <MoreColor> (raw) {}
};
void Test() {
MoreColor o = MoreColor::Octarina();
MoreColor r = MoreColor::Red();
}
並將其編譯:d
的改進: 結構A {模板靜態t的一(){返回T(1); } –
2009-10-28 22:21:17
好點,編輯包含您的建議 – ezpz 2009-10-29 00:41:37