设置静态成员对象

时间:2016-08-12 11:29:04

标签: c++

也许这个问题已被问到,但我找不到。 如何在创建静态成员对象时设置它?并可能执行其他一些任务。目标是在创建时调用它的一些设置器。

示例:

头文件A.h:

@@ -1592,6 +1592,11 @@ protected function _validateHeaderValue($value, $recurse = true)
             return;
         }

+        // Cast integers and floats to strings for purposes of header representation.
+        if (is_int($value) || is_float($value)) {
+            $value = (string) $value;
+        }
+
         if (! is_string($value) && (! is_object($value) || ! method_exists($value, '__toString'))) {

预期的实施文件A.cpp:

class A{

public:
    A::A();
    ~A::A();
    static QTimer updateTimer;

};

所以,正如你所看到的,我想在我的静态对象创建时只调用一次'setInverval()'函数,并且每次创建一个新的'A'对象时都不会调用它。

3 个答案:

答案 0 :(得分:2)

这就是构造函数的用途。

如果它是您自己的类型,只需编写一个构造函数。

如果类型没有构造函数而您无法修改它(例如,大概是QTimer来自Qt),那么将其包装在您自己的类型中。这是继承有用的教科书案例。您的包装器类将使用一些新功能扩展原始类:在初始化期间设置间隔。

struct QTimerWrapper : QTimer
{
   QTimerWrapper(int interval)
   {
      setInterval(interval);
   }
};

struct A
{
    static QTimerWrapper updateTimer;
};

QTimerWrapper A::updateTimer(100);

或者您可以使用合成,让QTimer成为QTimerWrapper的成员。

答案 1 :(得分:1)

除了组合或继承之外,您还可以创建一个返回修改后的对象的函数

QTimer newTimerWithInterval(int interval){
  QTimer timer;
  timer.setInteval(interval);
  return timer;
}

QTimer A::updateTimer(newTimerWithInterval(100));

您可能希望将该功能置于本地namespace下,因为您可能在其他任何地方都不需要它。

答案 2 :(得分:0)

也许是这样的?伪代码:

class A { static shared_ptr<Timer> _timer; };
..
A::A()
{
   if (_timer == nullptr)
   {
      _timer.assign(new Timer);
      _timer->setInterval(100);
   }
}

或者如果您不需要管理此计时器或拥有任何动态对象 - 那么您可以使用静态内部对象:

class A { /* without static member */ };
A::A
{
  static bool timerInited = false;
  static QTimer timer;
  if (!timerInited)
  {
     timer.setInterval(100);
     timerInited = true;
  }
}