Сигнал и слот C ++ не работают: слот не отвечает на событие - PullRequest
0 голосов
/ 05 февраля 2020

Я создаю систему сигналов и слотов с таким дизайном:

Есть классы сигналов и слотов

    struct timeDoubleEvent
    {
    public:
        timeDoubleEvent(const std::string& dataName)
            :
            dataName(dataName)
        {}
        const std::string& getDataName() const { return dataName; }
        Event<hydraPtr<DataHandler::timeDouble>> update;
        void fire(const hydraPtr<DataHandler::timeDouble>& timeDouble) const { update(timeDouble); }
    private:
        const std::string dataName;
    };

    class timeDoubleSlot
    {
    public:
        timeDoubleSlot(const std::string& dataName)
            :
            dataName(dataName)
        {}
        const std::string& getDataName() const { return dataName; }
        virtual void onEvent(const hydraPtr<DataHandler::timeDouble>& timeDouble) = 0;
    private:
        const std::string dataName;
    };

Слот в конечном итоге будет отличаться для разных случаев, поэтому я я создаю производный класс, вложенный во что-то:

    class BaseClass
    {
        // forward declaration
        class timePriceSlot;

    public:
        BaseClass(const std::string& name,
            const std::vector<hydraPtr<EventHandler::timeDoubleEvent>>& dataEventVector,
            const size_t& warmUpLength)
            :
            name(name),
            dataSlotVector(initializeDataSlotVector(dataEventVector)),
            warmUpLength(warmUpLength),
            dataStorage(initializeDataStorage(dataEventVector)),
            timeStorage(initializeTimeStorage(dataEventVector))
        {}

    private:
        const std::vector<hydraPtr<timePriceSlot>> dataSlotVector;

        const std::vector<hydraPtr<timePriceSlot>> initializeDataSlotVector(const std::vector<hydraPtr<EventHandler::timeDoubleEvent>>&);
        const bool& checkAllDataReceived(const std::string& dataName);

        class timePriceSlot : public EventHandler::timeDoubleSlot
        {
        public:
            timePriceSlot(const std::string& dataName,
                BaseClass& parent)
                :
                timeDoubleSlot(dataName),
                parent(parent)
            {}
            void onEvent(const hydraPtr<DataHandler::timeDouble>& timeDouble);
            BaseClass& getParent() const { return parent; }
        private:
            BaseClass& parent;
        };
    };

(показаны только соответствующие биты) вызов функции с помощью клиентской программы, такой как:

        const std::string stockName = "BBH";
        EventHandler::timeDoubleEvent event1(stockName);
        std::vector<hydraPtr<EventHandler::timeDoubleEvent>> eventVector(1);
        eventVector[0] = std::make_shared<EventHandler::timeDoubleEvent>(stockName);
        const hydraPtr<Signal::DerivedClass> myMA = std::make_shared<Signal::DerivedClass>(stockName + "_MA", eventVector, 10);

        const std::vector<hydraPtr<DataHandler::PriceTimeSeriesDataStruct>> myData = getAggregatedData();
        const std::vector<double> priceVectorCopy = myData[0]->getPriceVector();
        std::vector<double>::const_iterator it_d;
        const std::vector<std::string> timeVectorCopy = myData[0]->getDateTimeVector();
        std::vector<std::string>::const_iterator it_s;
        for (it_d = priceVectorCopy.begin(), it_s = timeVectorCopy.begin(); 
            it_d != priceVectorCopy.end(); it_d++, it_s++)
        {
            const hydraPtr<DataHandler::timeDouble> timeDoubleTemp = std::make_shared<DataHandler::timeDouble>(stockName, (*it_s), (*it_d));
            event1.fire(timeDoubleTemp);
        }

(DerivedClass является производным от BaseClass, с другой реализацией одной функции, не относящейся к этому вопросу). Однако я обнаружил, что даже при отсутствии сборки или запуска ошибка времени, ничего не происходит при пожаре события. На самом деле, функция onEvent никогда не посещается. Я сделал что-то не так? Заранее спасибо.

1 Ответ

0 голосов
/ 06 февраля 2020

Проблема была в этой строке

thisTimeDoubleEvent.update.connect([&](hydraPtr<DataHandler::timeDouble>& timeDouble) { (*thisTimePriceSlot).onEvent(timeDouble); });

И событие, и слот должны быть указателями, а не разыменованными значениями.

...