2016-08-12 2 views
-1

Vielleicht wurde diese Frage gestellt, aber ich konnte es nicht finden. Wie richte ich ein statisches Elementobjekt bei seiner Erstellung ein? Und möglicherweise einige andere Aufgaben ausführen. Das Ziel ist, dass einige der Setter zur Erstellungszeit aufgerufen werden.Setup statisches Mitglied Objekt

Beispiel:

Header-Datei Ah:

class A{ 

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

}; 

Erwartete Implementierungsdatei A.cpp:

#include "A.h" 

QTimer A::updateTimer.setInverval(100); // I need to set it's inverval to 100ms 
    // but only once in the beginning of it's life time 

A::A(){... 
} 

~A::A(){... 
} 

So, wie Sie sehen können, würde ich ‚setInverval nennen möchte () Funktion meines statischen Objekts nur einmal bei seiner Erstellung und nicht jedes Mal, wenn ein neues "A" -Objekt erstellt wird.

+0

@Bathsheba: Wenn nichts anderes, würde ich das als einen späteren Leser des Codes verwirrend und verdächtig finden, es sei denn, es wurde von einer großen FO-Kommentar Erklärung begleitet. Bevorzugen Sie es zu vermeiden, IMO. –

+0

@LightnessRacesinOrbit Wenn ich darf ... "FO"? – Quentin

+0

@Quentin: "frak off" und so weiter z.B. http://www.scotranslate.com/translate/scottish/big-fuck-off-rock/1/67321#.V63N37grJZo Leicht verdorbene US-Nutzung dokumentiert hier: https://www.urbandictionary.com/define.php?term = fuck% 20off% 20big –

Antwort

2

Dies ist, was Konstruktoren sind.

Wenn es sich um einen eigenen Typ handelt, schreibe einfach einen Konstruktor.

Wenn der Typ keinen Konstruktor hat und Sie ihn nicht ändern können (wie zum Beispiel QTimer kommt von Qt), dann wickeln Sie ihn in einen eigenen Typ, der das tut. Dies ist ein Lehrbuchfall der Vererbung, der nützlich ist. Ihre Wrapperklasse erweitert die ursprüngliche Klasse um einige neue Funktionen: Festlegen des Intervalls während der Initialisierung.

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

struct A 
{ 
    static QTimerWrapper updateTimer; 
}; 

QTimerWrapper A::updateTimer(100); 

Oder Sie könnten Zusammensetzung verwenden, die QTimer stattdessen ein Mitglied von QTimerWrapper sein müssen.

+0

Alle Antworten scheinen mein Problem zu lösen, aber dieses scheint das gewünschte Verhalten ohne viele Nebenwirkungen anzusprechen. Auch habe ich es wegen der Allgemeinheit meiner Frage gewählt, damit es für andere relevant bleibt. –

0

vielleicht so etwas? Pseudo-Code:

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

oder wenn Sie brauchen, um diese Timer nicht zu verwalten oder alle dynamischen Objekte haben - dann können Sie statisch innere Objekt Gebrauch gemacht:

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

Keine dynamische Zuordnung erforderlich. Auch jetzt ist 'A' verantwortlich für ein Verhalten des Timers, das nicht richtig erscheint. –

+0

hängt es tatsächlich davon ab, was Sie von diesem Timer-Objekt erwarten. Sie können auch nicht-statisches Objekt wie folgt verwenden: Klasse A {}; A :: A() {statisch unique_ptr Timer; if (timer == nullptr) .....usw. – fgrdn

+0

also rufen Sie diese Member-Funktion global auf: A :: updateTimer.setInterval (100); – fgrdn

1

Neben Zusammensetzung oder Vererbung, können Sie auch eine Funktion erstellen, die das geänderte Objekt

zurückgibt

Sie möchten vielleicht t setzen Er funktioniert unter local namespace, wie Sie es wahrscheinlich nirgendwo sonst brauchen.

Verwandte Themen