如何从基类函数返回派生类实例

问题描述 投票:0回答:1

假设我有两节课。

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
指针传递给基类,但它产生了相同的结果。

c++ class this c++20 derived-class
1个回答
0
投票

有时完成此类事情的一种方法是通过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

无论如何,通过引入中间基类模板,您可以将代码重用卸载到模板,并且只需编写一次包装器。

© www.soinside.com 2019 - 2024. All rights reserved.