2016-04-21 18 views
1

Ich möchte meinen Objektnamen als Zeichenfolge speichern. Darf ich erklären, ein paar Zeilen Code zu verwenden.So speichern Sie einen Objektnamen als Zeichenfolge

#include <iostream> 
#include <string> 
#include <stdio.h> 

using namespace std; 

class Example 
{ 
public: 
    string object_name; 
    //code... 
}; 

int main() 
{ 
    Example object; 
    cout<<object.object_name<<endl; //In this case the output should be "object", how to achieve this ? 
    return 0; 
} 
+2

Sie setzen es mit: 'object.object_name =" object ";' - Ich bin mir ziemlich sicher, das ist nicht die Antwort, die Sie wollten, aber C++ hat diese Art der Reflexion/Introspektion nicht. –

+2

Mögliches Duplikat von [get C++ - Objektname zur Laufzeit] (http://stackoverflow.com/questions/468956/get-c-object-name-in-runtime) –

+0

Vielleicht ein Blick auf [C++ reflexion] (http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-ac-application) – steiner

Antwort

0

Um diese Funktionalität in C++ zu erhalten, würden Sie object_name selbst, und der einzige Weg, das zu tun, ohne redundant Angabe es für die Example Instanz und seine object_name Datenelement zu verwenden, ist ein Makro müssen speichern die "stringified" Kennung:

Das ist ziemlich hässlich IMHO: Leute werden es für eine Laufzeit Funktionsaufruf zu verwechseln.

3

Es gibt keine Möglichkeit, auf den Variablennamen aus dem internen Objekt zuzugreifen, da er nur auf Quellcodeebene existiert. Beste, was Sie tun können, ist der Name des Objekts Konstruktor zur Verfügung zu stellen: Example object("object"), können Sie sogar wickeln Sie es in den Makro-Doppelarbeit zu vermeiden:

#define CREATE_OBJECT(TYPE, NAME) TYPE NAME(#NAME) 

CREATE_OBJECT(Example, object); 

Sie sollten mit Kopieren/Verschieben von Objekten variieren werden, wie der Name erhalten wird was möglicherweise nicht mit dem Kopiernamen korreliert. Sie müssen die Kopier-/Verschiebungskonstruktoren löschen, was die Nützlichkeit Ihres Objekts stark reduziert und neue Konstruktoren definiert, die existierende Objekte und neue Namen übernehmen und COPY_OBJECT Makro dafür erstellen.

Selbst dann gibt es ein Problem mit Referenzen ...

TL; DR: es normalerweise tut es nicht wert.

Verwandte Themen