C ++: la sintassi per l'accesso membro struct da un puntatore alla classe
Domanda
Sto cercando di accedere a un membro variabili struct, ma io non riesco a ottenere la giusta sintassi. I due errori di compilazione pr. accesso sono: errore C2274: 'stile funzione CAST': '' illegale lato destro operatore errore C2228: a sinistra di '.otherdata' deve avere classe / struttura / unione Ho provato varie modifiche, ma nessuno di successo.
#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;
}
Soluzione
Hai solo definire una struct lì, non allocare uno. Prova questo:
class Foo{
public:
struct Bar{
int otherdata;
} mybar;
int somedata;
};
int main(){
Foo foo;
foo.mybar.otherdata = 5;
cout << foo.mybar.otherdata;
return 0;
}
Se si vuole riutilizzare lo struct in altre classi, è anche possibile definire l'esterno struct:
struct Bar {
int otherdata;
};
class Foo {
public:
Bar mybar;
int somedata;
}
Altri suggerimenti
Bar
è la struttura interna definita all'interno Foo
. Creazione di oggetti Foo
non implicitamente creare membri del Bar
. È necessario creare esplicitamente l'oggetto di Bar utilizzando la sintassi Foo::Bar
.
Foo foo;
Foo::Bar fooBar;
fooBar.otherdata = 5;
cout << fooBar.otherdata;
In caso contrario,
Creare l'istanza bar come membro della classe Foo
.
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;
Si crea una struttura annidata, ma non hai mai creare qualsiasi istanza di esso all'interno della classe. È necessario dire qualcosa come:
class Foo{
public:
struct Bar{
int otherdata;
};
Bar bar;
int somedata;
};
Si può quindi dire che:
foo.bar.otherdata = 5;
Siete solo dichiarando Foo :: Bar ma non un'istanza (non so se questa è la terminologia corretta)
Vedi qui per l'uso:
#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;
}
struct Bar{
int otherdata;
};
Qui avete appena definito una struttura, ma non è stato creato alcun oggetto di esso. Quindi quando si dice foo.Bar.otherdata = 5;
è errore del compilatore. Creare un oggetto di struct Bar come Bar m_bar;
e quindi utilizzare Foo.m_bar.otherdata = 5;