假设我有两节课。
base
和derived_from_base
。 base
将包含许多控制 base
和派生类将使用的某些方面的函数。但是,我想这样做,以便我可以链接对这些函数的调用。
class data_class {};
class base {
public:
base* add_data(data_class* data) {
m_Data = data;
return this;
}
private:
data_class* m_Data;
};
class derived_from_base : public base {
void custom_function() {}
};
int main() {
data_class* someData = new data_class();
// "myClass" has none of the data after this return
derived_from_base* myClass = derived_from_base().add_data(someData);
derived_from_base* myOtherClass = derived_from_base();
// The data is available in this class now.
myOtherClass.add_data(someData);
}
我尝试将派生类
this
指针传递给基类,但它产生了相同的结果。
有时完成此类事情的一种方法是通过CRTP-idiom。
在你的情况下,这看起来像这样:
class Base {
private:
// ...
public:
Base* add_data(data_class* data) {
// implementation ...
}
};
template <typename T>
class BaseCRTP : public Base {
public:
T* add_data(class_data* data) {
return static_cast<T*>(Base::add_data(data));
}
};
class Derived : public BaseCRTP<Derived> {
public:
void custom_function() {}
};
int main() {
Derived derived;
derived.add_data(new class_data())->custom_function();
}
从几个方面来说这都不是最好的风格。其一,最好返回一个引用,而不是一个指针。所以
*this
,而不是this
。
无论如何,通过引入中间基类模板,您可以将代码重用卸载到模板,并且只需编写一次包装器。