У меня есть два класса C++, SuperClass & SubClass. Каждый из них имеет функцию set, и функция возвращает объект класса в конце, так как я хочу выполнить их в одной строке. Код показан ниже:Возвращение определения подкласса из функции суперкласса
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
}
Однако функция Seta() возвращает определение суперкласса, так что я не могу приковать его с функцией SETB(), объявленной в подклассе.
Есть ли способ сделать функцию SetA() возвратом определения SubClass? Так что я могу выполнить их в одной строке.
Заранее спасибо. Elliott
Вопрос Update (на 2014-09-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 в этом случае?
Еще раз спасибо. Elliott
Читайте об [любопытно повторяющемся шаблоне шаблонов] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). –
мой совет - пересмотреть свой дизайн. CRTP будет работать, но ваш дизайн будет беспорядочным. – egur
Спасибо всем вам.Кажется, CRTP - хороший способ решить эту проблему. Однако могу ли я использовать SuperClass самостоятельно при таком подходе? – Elliott