我有兩個C++類,SuperClass &子類。他們每個人都有一個設置功能,該功能將在最後返回類對象本身,因爲我想在一行中執行它們。代碼如下所示:從超類功能返回子類定義
class SuperClass
{
public:
SuperClass& SetA(int a)
{
m_a = a;
return *this;
}
virtual void Print()
{
printf("a=%i", m_a);
}
protected:
int m_a;
};
class SubClass : public SuperClass
{
public:
SubClass& SetB(double b)
{
m_b = b;
return *this;
}
virtual void Print()
{
printf("a=%i, b=%f", m_a, m_b);
}
protected:
double m_b;
};
int main(int argc, char* argv[])
{
SubClass().SetB(123.4).SetA(123).Print(); // Works fine
SubClass().SetA(123).SetB(123.4).Print(); // Failed
}
然而,組A()函數返回超類的定義,所以我不能在子類中聲明的組B()函數鏈它。
有沒有什麼辦法讓SetA()函數返回子類的定義?這樣我就可以在一行中執行它們。
在此先感謝。 埃利奧特
問題更新(在2014年9月24日)爲CRTP的方法: 感謝所有意見。我認爲CRTP是解決這個問題的好方法。不過,我也想單獨使用SuperClass。說:
int main(int argc, char* argv[])
{
SubClass().SetB(123.4).SetA(123).Print(); // Works fine
SubClass().SetA(123).SetB(123.4).Print(); // Failed, but works in CRTP
SuperClass().SetA(123).Print(); // Is CRTP able to do this?
}
在這種情況下,CRTP方法是否也有幫助?
再次提前致謝。 埃利奧特
閱讀[奇怪的循環模板模式](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)。 – 2014-09-23 11:56:46
我的建議是重新考慮你的設計。 CRTP可以工作,但是你的設計會很混亂。 – egur 2014-09-23 13:19:07
謝謝大家的意見。看來CRTP是解決這個問題的好方法。但是,我可以在這種方法下單獨使用SuperClass嗎? – Elliott 2014-09-24 01:44:08