2013-12-08 13 views
15

Ich möchte Bezeichner für eine Klasse mit dem Namen Bestellung in einer threadsafe Weise generieren. Der folgende Code wird nicht kompiliert. Ich weiß, dass die atomaren Typen keine Kopierkonstruktoren haben, und ich nehme an, das erklärt, warum dieser Code nicht funktioniert. Kennt jemand einen Weg, diesen Code tatsächlich zum Laufen zu bringen? Ich lerne immer noch, also lass es mich auch wissen, wenn ich auf dem Holzweg bin (wenn es so wäre, würde ich es begrüßen, wenn du mich auf einen alternativen Ansatz hinweisen könntest). Vielen Dank!Initialize statische atomare Elementvariable

#include <atomic> 
#include <iostream> 

class order { 
public: 
    order() { id=c.fetch_add(1); } 
    int id; 
private: 
    static std::atomic<int> c; 
}; 

std::atomic<int> order::c = std::atomic<int>(0); 

int main() { 
    order *o1 = new order(); 
    order *o2 = new order(); 
    std::cout << o1->id << std::endl; // Expect 0 
    std::cout << o2->id << std::endl; // Expect 1 
} 

die obigen Ergebnisse in den folgenden Fehlern Kompilieren:

order.cpp:45:51: error: use of deleted function 
     ‘std::atomic<int>::atomic(const std::atomic<int>&)’ 
In file included from order.cpp:3:0: 
/usr/include/c++/4.7/atomic:594:7: error: declared here 

Antwort

28

I know that the atomic types do not have copy constructors, and I assume that explains why this code does not work.

Ja, sagt der Fehler, dass ganz klar.

Does anybody know a way to actually get this code to work?

statt copy-Initialisierung von einem temporären, die eine leicht zugängliche Copykonstruktor erfordert:

std::atomic<int> order::c = std::atomic<int>(0); 

Verwendung Direkt Initialisierung, das nicht der Fall ist:

std::atomic<int> order::c(0); // or {0} for a more C++11 experience 

Sie wahrscheinlich sollte bevorzuge das trotzdem, es sei denn, du liest unnötigerweise einen ausführlichen Code.

19

Wie über die Definition

std::atomic<int> order::c{0} 
+0

Vielen Dank Joachim! Ich habe deine Antwort aufgefrischt, aber ich werde Mike's akzeptieren, da es ein bisschen wortreicher ist. Ich hoffe, es macht Ihnen nichts aus! ;) – Teisman

1

Sie können auch atomic_init verwenden:

std::atomic<int> data; 
std::atomic_init(&data, 0);