2009-05-27 8 views
8

Sto provando ad accedere a un membro structs variables, ma non riesco a ottenere la sintassi corretta. I due errori di compilazione pr. accesso sono: errore C2274: 'cast stile-funzione': illegale come lato destro di '.' operatore errore C2228: left di '.otherdata' deve avere classe/struct/union Ho provato varie modifiche, ma nessuna riuscita.C++: sintassi per l'accesso alla struct del membro dal puntatore alla classe

#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; 
} 

risposta

15

Si definisce solo una struttura lì, non allocata. 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 lo struct esterno:

struct Bar { 
    int otherdata; 
}; 

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

Grazie, completamente dimenticato. E funziona come un fascino. –

+4

Il codice non è esattamente equivalente. Nel primo esempio, il nome della struttura della barra è in realtà Foo :: Bar. –

+0

Hai ragione, Neil, ha modificato la mia risposta. – schnaader

8

Bar è la struttura interna definita all'interno Foo. La creazione dell'oggetto Foo non crea implicitamente i membri di Bar. È necessario creare esplicitamente l'oggetto di Bar usando la sintassi Foo::Bar.

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

In caso contrario,

creare l'istanza bar come membro in Foo della classe.

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

Mi piace questo stile meglio di quello tradizionale "struct {} ". –

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; 
}; 

È quindi possibile dire:

foo.bar.otherdata = 5; 
1

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; 
} 
0
struct Bar{ 
     int otherdata; 
    }; 

Qui hai appena definito una struttura ma non ne hai creato alcun oggetto. Quindi quando dici foo.Bar.otherdata = 5; è un errore del compilatore. Creare un oggetto di struct Bar come Bar m_bar; e quindi utilizzare Foo.m_bar.otherdata = 5;