2009-05-27 8 views
8

Ich versuche auf ein Mitglied Structs-Variablen zuzugreifen, aber ich kann nicht scheinen, um die Syntax richtig zu bekommen. Die beiden Kompilierfehler pr. Zugang sind: Fehler C2274: 'Funktion-Stil Cast': illegal als rechte Seite von '.' Operator Fehler C2228: links von '.otherdata' muss Klasse/struct/union haben Ich habe verschiedene Änderungen versucht, aber keine erfolgreich.C++: Syntax für den Zugriff auf Member-Struktur von Zeiger auf Klasse

#include <iostream> 

using std::cout; 

class Foo{ 
public: 
    struct Bar{ 
     int otherdata; 
    }; 
    int somedata; 
}; 

int main(){ 
    Foo foo; 
    foo.Bar.otherdata = 5; 

    cout << foo.Bar.otherdata; 

    return 0; 
} 

Antwort

15

Sie definieren dort nur eine Struktur, keine Zuordnung. Versuchen Sie folgendes:

class Foo{ 
public: 
    struct Bar{ 
     int otherdata; 
    } mybar; 
    int somedata; 
}; 

int main(){ 
    Foo foo; 
    foo.mybar.otherdata = 5; 

    cout << foo.mybar.otherdata; 

    return 0; 
} 

Wenn Sie die Struktur in anderen Klassen wiederverwenden möchten, können Sie auch die Struktur außerhalb definieren:

innerhalb Foo definiert
struct Bar { 
    int otherdata; 
}; 

class Foo { 
public: 
    Bar mybar; 
    int somedata; 
} 
+0

Danke, komplett vergessen, dass. Und funktioniert wie ein Zauber. –

+4

Der Code ist nicht genau gleichwertig. Im ersten Beispiel ist der Name der Bar-Struktur wirklich Foo :: Bar. –

+0

Sie haben Recht, Neil, meine Antwort bearbeitet. – schnaader

8

Bar innere Struktur ist. Die Erstellung von Foo Objekt erstellt nicht implizit die Bar Mitglieder. Sie müssen das Objekt "Bar" explizit mit der Syntax Foo::Bar erstellen.

Foo foo; 
Foo::Bar fooBar; 
fooBar.otherdata = 5; 
cout << fooBar.otherdata; 

Andernfalls

die Bar-Instanz als Mitglied erstellen in Foo Klasse.

class Foo{ 
public: 
    struct Bar{ 
     int otherdata; 
    }; 
    int somedata; 
    Bar myBar; //Now, Foo has Bar's instance as member 

}; 

Foo foo; 
foo.myBar.otherdata = 5; 
+0

Ich mag diesen Stil besser als der traditionelle C-Stil "struct {} ". –

5

Sie erstellen eine verschachtelte Struktur, aber Sie erstellen keine Instanzen davon innerhalb der Klasse. Sie müssen so etwas sagen wie:

class Foo{ 
public: 
    struct Bar{ 
     int otherdata; 
    }; 
    Bar bar; 
    int somedata; 
}; 

Sie können dann sagen:

foo.bar.otherdata = 5; 
1

Sie nur Foo :: Bar deklarieren, aber Sie instanziiert es nicht (nicht sicher, ob das die richtige Terminologie ist)

sehen Sie hier für Nutzung:

#include <iostream> 

using namespace std; 

class Foo 
{ 
    public: 
    struct Bar 
    { 
     int otherdata; 
    }; 
    Bar bar; 
    int somedata; 
}; 

int main(){ 
    Foo::Bar bar; 
    bar.otherdata = 6; 
    cout << bar.otherdata << endl; 

    Foo foo; 
    //foo.Bar.otherdata = 5; 
    foo.bar.otherdata = 5; 

    //cout << foo.Bar.otherdata; 
    cout << foo.bar.otherdata << endl; 

    return 0; 
} 
0
struct Bar{ 
     int otherdata; 
    }; 

Hier haben Sie gerade eine Struktur definiert, aber kein Objekt davon angelegt. Daher, wenn Sie foo.Bar.otherdata = 5; sagen, ist es Compilerfehler. Erstellen Sie ein Objekt der struct Bar wie Bar m_bar; und verwenden Sie dann Foo.m_bar.otherdata = 5;