Как обновить/переназначить члена класса Chrono::timestamp для прокрутки истекшего времени

Пример кода был создан из-за того, что мне не хватало чего-то, что было частью реализации моей функции.

Моя локальная функция была отмечена как const, и я забыл включить ее в код ниже. Кроме того, эта отметка const также стала причиной того, что я увидел ошибку ниже, и мне потребовалось слишком много времени, чтобы осознать это.

Как переназначить переменную time_point члена класса хронографа?

Я просмотрел часовое видео от {@Howard Hinnant} и не увидел ничего, что указывало бы на то, что мне нужно.

Класс вывода времени

#include <iostream>
#include <chrono>
#include <cstdint>
namespace chrono = std::chrono;
namespace chrono_lit = std::chrono_literals;
using namespace chrono_lit;

class TrackTimeElapsed {
  public:
    TrackTimeElapsed(uint64_t interval):
      m_timestamp(chrono::steady_clock::now()), m_interval(interval) {}
    ~TrackTimeElapsed() {}
    void trackTime() const { // Edit @14:15 << Just realized my function was const locally, and that was causing issues.
      chrono::time_point<chrono::steady_clock> now = chrono::steady_clock::now();
      auto diff = chrono::duration_cast<std::chrono::seconds>(now - m_timestamp);
      if (diff.count() > m_interval) {
        std::cout << "Time elapsed" << std::endl;
        // Update timestamp to help track when next print out needs to occur.
        m_timestamp = now; // const related error was being experienced here, which makes sense due to my function being const.
      }
    }
  private:
    chrono::time_point<chrono::steady_clock> m_timestamp;
    uint64_t m_interval;
};

Вот ошибка, которую я получаю при попытке скомпилировать:

Class File: error: passing 'const std::chrono::_V2::system_clock::time_point' {aka 'const std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >'} as 'this' argument discards qualifiers [-fpermissive]
  105 |         timestamp = now;

У вас есть и TrackTimeElapse, и TrackTimeElapsed. Пожалуйста, предоставьте реальный код.

G.M. 11.07.2024 20:50
Компилируется здесь с исправленной опечаткой в ​​имени класса. Полное предположение: trackTime может быть отмечено const
chris 11.07.2024 20:53

Почему m_interval не указана продолжительность с временным разрешением? То, как вы это написали, предполагает очень конкретное временное разрешение для steady_clock, которое зависит от платформы.

Nicol Bolas 11.07.2024 20:54

«Проблема здесь связана с тем, что оператор присваивания не определен». Какую именно ошибку вы получаете?

Nicol Bolas 11.07.2024 20:55

@Г.М. Я использую пример кода, чтобы изложить задачу кратко. Это отражает то, что у меня есть в моем проекте. Если вам нужен некоторый контекст, я пишу журнал файлов на основе времени, который закрывает и открывает новый файл по истечении определенного периода времени с момента открытия текущего файла.

Kenneth Cornett 11.07.2024 20:59

«// Issue here» В чем проблема?? Кажется, ваш код компилируется нормально для всех, кто его пробовал. Это не минимально воспроизводимый пример , если только вы не объясните, чего вы ожидали и что произошло на самом деле.

Drew Dormann 11.07.2024 21:05

Что происходит, когда вы пытаетесь выполнить задание m_interval внутри trackTime()? Какое (если есть) сообщение об ошибке появляется в результате? Будет ли это связано с симптомами, указанными в вашем вопросе?

Howard Hinnant 11.07.2024 21:06

Я понял проблему. Моя функция была объявлена ​​как const, и она мне просто понравилась. Приносим извинения!

Kenneth Cornett 11.07.2024 21:14

@chris Если вы сделаете свой комментарий ответом, я поддержу его. Я также надеюсь, что это будет отмечено правильно.

Howard Hinnant 11.07.2024 21:15

Я отмечу правильно. Но он также должен указать, что это было до публикации обновления.

Kenneth Cornett 11.07.2024 21:16

@HowardHinnant, спасибо за сигнал, я отвлекся. Избегая еще одного обращения к ОП, я с гордостью могу сказать, что теперь это «она» :)

chris 11.07.2024 21:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В целом проблем с назначением time_point (это просто завернутый номер) не возникает, но в обновленном сообщении trackTime отмечен const, поэтому изменение членов this не разрешено.

void trackTime() const {
                 ^^^^^ Remove this

По крайней мере, для меня имя функции предполагает, что она может изменить объект, поэтому отсутствие const соответствует моим ожиданиям.

Другие вопросы по теме