首页 > 解决方案 > 如何将成员函数传递给基类构造函数?

问题描述

我有一个要使用的类结构,并且我想使用派生类的函数作为构造函数参数传递给基类。我找不到正确的语法(C 的新手 :))

这是我使用的基类,它有一个带有回调函数的构造函数:

class SPortSensor {
        public:
            SPortSensor(sensorData (*pCallback)(SPortSensor*));
            sensorData getValue();
        private:
            sensorData (*getData)(SPortSensor*);
    };

这是在类 (pCallback) 中实现回调函数的派生类,因此它具有不同的构造函数和需要传递给基类构造函数的成员函数:

    class SimpleSensor : public SPortSensor {
        public: 
            SimpleSensor(int id);
            long value;
        private:
            int _id;
            sensorData pCallback(SPortSensor*);
    };

这个头文件编译得很好。我看到的唯一错误是 SimpleSensor 构造函数的实现。我找不到正确的语法:

sensorData SimpleSensor::pCallback(SPortSensor* sensor) {
   ...
}

SimpleSensor::SimpleSensor(int id) : SPortSensor(pCallback) {
  _id = id;
}

谷歌搜索这个问题并没有太大帮助,因为我可能没有使用正确的搜索词并且对 c++ 了解不够(我是 C# 人)。

标签: c++functionconstructormemberderived-class

解决方案


循环参考闻起来可能存在一些一般性的所有权问题。

但是,解决僵局的一种方法是使用std::function<sensorData(SPortSensor*)>函数指针而不是函数指针。然后用指向自身的 lambda 初始化基类:

SimpleSensor(int id) : SPortSensor([this](SPortSensor* sps) { return pCallback(sps); }) { }

我不能有意识地宽恕这个,但当我尝试它时它并没有爆炸。需要注意的是,SimpleSensor 在调用基本构造函数时不会被初始化,因此 SPortSensor 不能在其自己的构造函数中调用 lambda。


推荐阅读