如何将成员函数传递给基类构造函数?

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

我有一个要使用的类结构,我想使用派生类的功能作为构造函数参数传递给基类。我找不到合适的语法(对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#专家。

c++ function constructor member derived-class
2个回答
1
投票

循环引用闻起来好像有一些一般的所有权问题。

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

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

我无法很好地宽恕这一点,但是当我尝试它时并没有爆炸。一个警告是,调用基本构造函数时,不会初始化SimpleSensor,因此SPortSensor不能在其自己的构造函数中调用lambda。


0
投票

回叫通常发生在不同的对象之间。一种解决方案是在构造函数之后(例如在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;
}
© www.soinside.com 2019 - 2024. All rights reserved.