也许这个问题已被问到,但我找不到。 如何在创建静态成员对象时设置它?并可能执行其他一些任务。目标是在创建时调用它的一些设置器。
示例:
头文件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'对象时都不会调用它。
答案 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;
}
}