【问题标题】:C++ / Qt QTime - How to use the objectC++ / Qt QTime - 如何使用对象
【发布时间】:2018-07-12 21:34:16
【问题描述】:

这更像是一个通用的 C++ 初学者问题:

我有 2 节课:

  • A 类,包括一个“ReadData”方法,一旦 TCP 套接字接收到新数据就会调用该方法
  • B 类,包括通过 TCP 发送大量数据的方法“开始”。

由于架构的原因,不可能将两种方法都放在一个类中。

我想做什么:

  1. 调用 B 类中的“开始”后立即启动计时器。
  2. 调用 A 类中的“ReadData”后立即停止计时器。
  3. 然后我会计算差异,看看花了多长时间......

我的问题:

  • 我在哪里创建对象:

    QTimer transferTimer;
    
  • 如何将对象传递给我的两个类?

C++ 中如何正确处理这个问题?

谢谢。

【问题讨论】:

  • 您可能有第三个 C 类来保存计时器 (QTimer)。 A 类和 B 类都将保留对 C 类实例的引用。 B 类将调用 C::start() 来启动计时器,A 类将调用 C::stop() 来停止计时器。函数 C::diff() 将返回经过的时间 (QTime::elapsed ())。
  • 你能举个例子“..keep the references to class C”吗?顺便说一句:A 类位于 B 之外的另一个命名空间中
  • 你可以访问这两个类吗?你能修改它们(代码)吗?
  • 是的,应该没问题

标签: c++ qt qtime


【解决方案1】:

这是可能的解决方案之一。它被简化以展示这个想法:

class C
{
public:
  void start()
  {
    m_startTime = QTime::currentTime();
  }

  void stop()
  {
    m_endTime = QTime::currentTime();
  }

  int difference() const
  {
    return m_startTime.secsTo(m_endTime);
  }

private:
  QTime m_startTime;
  QTime m_endTime;
};

class A
{
public:
  A(std::shared_ptr<C> c) : m_c(c)
  {}

  void ReadData()
  {
    // ...
    m_c->stop();

    int transferTime = m_c->difference(); // seconds
  }

private:
  std::shared_ptr<C> m_c;
};

class B
{
public:
  B(std::shared_ptr<C> c) : m_c(c)
  {}

  void start()
  {
    // ...
    m_c->start();
  }

private:
  std::shared_ptr<C> m_c;
};

int main(int argc, char ** argv)
{
  auto c = std::make_shared<C>();
  // a and b keep reference to instance of class C
  A a(c);
  B b(c);

  [..]
  return 0;
}

【讨论】:

  • 谢谢,我理解这个想法。问题是:A 类的构造函数是从另一个 D 类调用的(这里创建了 A 的对象)。好的,我的第一个想法是在 D 类中创建计时器,然后将对象传递给 A,但是 B 类的对象没有在 D 类中创建,所以我遇到了问题。除了在构造函数中传递指针之外,还有其他方法吗?
  • 之后可以传递指针。例如,使用将设置计时器对象的函数调用。当然,这应该发生在 B::start() 调用之前。
  • 谢谢,我会尝试实现函数调用并写如果我失败:)
  • 不,对不起,我不明白。我现在有一个 C 类,就像你在解决方案中给出的那样。在 C 类中,我创建了一个对象作为指针并将其设置为 null: ClassC* transferTimer = nullptr;然后我在 C 类中实现了一个函数: void set Timer() { transferTimer = new ClassC() };但是我现在如何从 B 类调用函数,我的计时器应该从哪里开始?我试图包含 C 类,但不知道如何启动该功能。以及如何使用 A 类(相同对象)中的 Stop()?这里缺少一些 C++ 基础知识 ;_;
  • 要回答,我至少需要知道您的 A B 和 D 类以及它们之间的关系。如果 D 创造了 A,那么谁创造了 B?您必须找到一个“知道” B 和 D 的组件。该组件将创建 C,将其传递给 B 和 D,然后 D 将其传递给 A。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多