我有一个要使用的类结构,我想使用派生类的功能作为构造函数参数传递给基类。我找不到合适的语法(对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;
}
Google搜索此问题没有太大帮助,因为我可能没有使用正确的搜索词并且对C ++的理解不足(我是C#专家。
循环引用闻起来好像有一些一般的所有权问题。
但是,解决问题的一种方法是使用std::function<sensorData(SPortSensor*)>
而不是函数指针。然后使用指向自身的lambda初始化基类:
SimpleSensor(int id) : SPortSensor([this](SPortSensor* sps) { return pCallback(sps); }) { }
我无法很好地宽恕这一点,但是当我尝试它时并没有爆炸。一个警告是,调用基本构造函数时,不会初始化SimpleSensor,因此SPortSensor不能在其自己的构造函数中调用lambda。
回叫通常发生在不同的对象之间。一种解决方案是在构造函数之后(例如在init方法中)区分派生类方法的用法,并将该方法声明为virtual。
#include <iostream>
class A {
public:
virtual void f() {
std::cout << "Class A\n";
}
A() {
this->f();
}
void g() {
this->f();
}
virtual ~A() = default;
};
class B: public A {
public:
virtual void f() {
std::cout << "Class B\n";
}
B(): A() {
}
virtual ~B() = default;
};
int main() {
A a;
B b;
a.g();
b.g();
return 0;
}