2017-03-02 5 views
1
struct student { 
    string name; 
    int age; 
}; 

int main() { 
    student a1; 

    cout << a1[0] << endl; //Access the first variable of the struct 
    cout << a2[1] << endl; //Access the first variable of the struct 
} 

Wie kann ich auf den Wert von der C++ - Struktur mit Index zugreifen und abrufen, anstatt "a1.name" ??Wie Zugriff auf C++ - Struktureigenschaftswert mit Index?

+4

Sie können nicht. Warum willst du das machen? Wenn Sie ein Array verwenden möchten, verwenden Sie ein Array. Sieht aus wie ein [XY-Problem] (http://xyproblem.info/). –

+0

Sie können dies in C++ nicht tun – Sean

+0

Wenn die Sprache das erlaubt ... Stellen Sie sich die Verwüstung vor, die es in Ihrem Programm verursachen würde, wenn Sie eines Tages entscheiden würden, die Reihenfolge der Mitglieder in 'Student' zu ändern. Außerdem wird es ein Alptraum sein, den es zu pflegen gilt. Sie können nicht herausfinden, ob 'a1 [0]' der Name oder das Alter ist, ohne die Definition der 'struct' nachzuschlagen. –

Antwort

0

Sie können nicht.

Nicht bis die Reflexion in C++ eingeführt wurde, was (hoffentlich) in C++ 20 der Fall sein sollte.

Some projects einführen Tupel mit Namen erweitert, aber es immer noch nicht real Strukturen.

1

Wie Zugriff C++ Struktureigenschaftswert mit Index?

Sie können nicht. C++ - Sprache hat keine Funktion, die dies erlauben würde. Dies könnte in einer Sprache möglich sein, die (statische) Reflexion unterstützt.

Sie könnten stattdessen eine std::tuple verwenden, die indizierten Memberzugriff zulässt, aber das ist eine Lesbarkeitsschwäche, da Sie die Member nicht benennen können.

3

Sie können nicht. Zumindest nicht auf die direkte Art und Weise, wie Sie es tun wollen, und ohne teilweise zu definieren, was eine Struktur ist. Ich werde meine Antwort in zwei Teile die erste Erklärung möglich Möglichkeiten, um zumindest nahe, was Sie wollen und die zweite aufgespalten zu erklären, was Sie sollten eigentlich tun:

bekommen und schmutzig

Es gibt zwei Möglichkeiten (die ich zur Zeit mit oben kommen kann), dass Sie etwas zu denken geben könnte:

  • eine Wrapper-Klasse verwenden - während C++ erhöht sich die Flexibilität der Struktur ist es nicht ihre Absicht einer Änderung einfacher heterogener Datencontainer. Es erlaubt jedoch eine Überlastung des Operators einschließlich des Operators []. Wenn Sie also eine Klasse erstellen, die die Struktur als ihr Element enthält (dh sie umschließt die Struktur), können Sie die Daten der Struktur unter Verwendung von [] verfügbar machen. Dies kommt so nah wie möglich an das, was Sie tun möchten. Es vereitelt jedoch den ganzen Zweck der Verwendung einer Struktur, da Sie dies mit einfachen Nicht-Sturct-Klassenmitgliedern tun können, aber ich habe es tatsächlich vor nicht allzu langer Zeit gesehen, als ich durch eine C++ - Bibliothek ging, die ein vorheriges C- Version von sich selbst, um modernere Funktionen bereitzustellen, ohne dass der C-Code vollständig neu geschrieben werden muss.
  • Verwenden Sie Zeiger mit einem Offset - Indexierung im Allgemeinen vorschlagen, dass der zugrunde liegende Container eine Konsistenz hat, wenn es um die Blöcke von Daten kommt, die es enthält. Das Problem besteht darin, dass eine Struktur diesem nicht unbedingt folgt, da sie (genau wie in Ihrem Fall) mehrere Datentypen enthalten kann. Wenn Sie die Heterogenität Ihrer Struktur opfern und mit einem einzelnen Datentyp (zum Beispiel einem oder mehreren Doubles) bleiben können, können Sie sicher (bis zu dem Punkt, an dem Sie immer die Anzahl der Elemente der Struktur merken müssen) einen Zeiger verwenden und eine zunehmende/abnehmende Verschiebung, um auf seine Mitglieder zuzugreifen. Wie bei jeder Art von Daten, wenn Sie eine Standardreferenz (aka Zeiger) auf etwas erstellen, zeigt dieser Verweis auf die Adresse des Anfanges des Speichers, den diese Daten verwenden. Es ist üblich, Zeiger zu verwenden, um durch Arrays zu iterieren, und es funktioniert genau so - Erstellen Sie einen Verweis auf Ihre Struktur und das Add + 1, +2, ... (so viele Mitglieder, die struct hat). Dies macht die Dinge jedoch übermäßig kompliziert und ist fehleranfällig. Wie erwähnt, erfordert es auch die Verwendung der gleichen Art von Daten in Ihrer Struktur.

Die Alternativen ...

Von dem, was Sie als Informationen gegeben haben, ich glaube, Sie für eine ganz andere Art von Daten suchen - ein Wörterbuch, Karte oder einer Liste, die eine Art von benutzerdefinierten enthält generischer Datencontainer, der alle Arten von Daten enthalten kann, aber auch den Datentyp dieser Daten speichert, um deren ursprünglichen Zustand wiederherstellen zu können. Viele Bibliotheken bieten solche Container zum Beispiel Qt hat die QVariant (Teil des Kernmoduls), boost hat die boost::variant, std::tuple (oder noch besser Tupel genannt) mit Ihrem Standard C++ (seit C++ 11) und so weiter zur Verfügung gestellt. Ich kann mehr über Qt sprechen, da ich mehr Erfahrung damit habe. Es bietet die (eine typedef für QList<QVariant>), die Indexierung ermöglicht. Natürlich müssen Sie dazu 1) Ihre Struktur-Sache aufgeben und 2) weiterentwickelte Container verwenden, die möglicherweise große Nachteile bei allem mit sich bringen, was Sie gerade betreiben, einschließlich Lizenzierungsproblemen, Speicheraufwand, größeren Binärdateien und vielem mehr zusätzliche Bibliotheksdateien usw.

+0

Wie wäre es mit benannten Tupeln? Nicht so gut wie Reflektion, aber nah am Ziel, und keinerlei Overhead (außer zur Kompilierzeit) –

+0

Ehrlich gesagt habe ich nie benannte Tupel verwendet. Aus einer kurzen Recherche im Internet geht hervor, dass dies die bessere Version der Standardtupel ist. Also ja, es sollte in der Tat eine gute Lösung sein. Bearbeite meinen Beitrag (ich habe Tupel erwähnt, füge aber jetzt auch die benannte Version hinzu). Vielen Dank! – rbaleksandar