2016-11-05 3 views
1

Ich habe eine Klasse wie folgt aus:eindeutige ID der Klasse Instanz

class ExampleClass { 

private: 
    int _id; 
    string _data; 

public: 
    ExampleClass(const string &str) { 
     _data = str; 
    } 
    ~ExampleClass() { 

    } 
    //and so on...  

} 

Wie kann ich einzigartige hinzufügen integer Kennung (_id) für jede Instanz der Klasse ohne globale Variable (!)?

+1

„Sie können nicht“ ist die kurze Antwort, es sei denn, Ihr 'int' ist breit genug, um einen Zeiger zu halten, und Sie verwenden einen hässlichen Cast von' this'. –

+0

@SamVarshavchik, wird jeder Cast von 'this' bis int einzigartig sein? – kekyc

+1

Solange "this" ist einzigartig, und "int" ist breit genug, um ein int zu halten, nach den Regeln der Mathematik in diesem Universum. –

Antwort

2

Verwenden Sie einen privaten statischen Member int, der von allen Instanzen der Klasse gemeinsam genutzt wird. In statischen int im Konstruktor nur inkrementieren und speichern Sie den Wert für Ihre ID-Mitglied;

class ExampleClass { 

private: 
    int _id; 
    string _data; 
    static int counter=0; 
public: 
    ExampleClass(const string &str) { 
     _data = str; 
     id=++counter; 
    } 

Update:

Sie müssen Berücksichtigung in Ihrem Copykonstruktor und Betreiber nehmen = welches Verhalten Sie wollen (hängt von Ihren Bedürfnissen, ein neues Objekt oder einem identischen).

+0

"Auftragnehmer"? Haha ... :-) ... PS: Ich bin nicht der Downvoter obwohl – WhiZTiM

+0

@WhiZTiM Danke, aber die Antwort ist gut.Und ich war der erste –

0

Sie können statische Daten in Ihrer Klasse ausblenden, die die eindeutige ID bereitstellen.

Beispiel:

class ExampleClass { 

private: 
    int _id; 
    static int idProvider; 
public: 
    ExampleClass(const string &str) 
      : _id(++idProvider) 
    {} 
} 

int ExampleClass::idProvider = 0; 

die Logik ist jedes Mal wenn Sie ein Objekt von ExampleClass erstellt wird es die idProvider erhöhen, die dann als eine eindeutige ID zuweisen Ihre id

+0

Ich hatte dies im Hinterkopf, aber das Problem ist, ich weiß es nicht wie groß ist der Datensatz? Natürlich kann ich hoffen, dass _id groß genug ist, um wirklich lange Zahlen zu behalten ... – kekyc

+0

@kekyc, dann benutze ein 'std :: uint64_t' (typischerweise ein' unsigned long long') ... welches einen maximalen Wert von über '18446744073709551615' ... Wenn Ihr Dataset größer ist als das .... Dann möchten Sie vielleicht Ihren Entwurf ganzheitlich überdenken ... Vielleicht eine UUID verwenden? – WhiZTiM

+0

@WhiZTiM Ich entschied mich schließlich, 'diesen' Zeiger auf _id zu werfen, weil es einzigartig ist, während die aktuelle Instanz existiert und es auch einen bestimmten Bereich hat, abhängig von meinem System, so vermeide ich den Typüberlauf im Prinzip. Wie auch immer, danke für deine Antwort! (Wenn Sie etwas zu dieser "Lösung" sagen möchten, würde ich es gerne hören). – kekyc