2009-05-27 12 views
8

Estoy tratando de acceder a un miembro estructura las variables, pero parece que no puedo obtener la sintaxis correcta. Los dos errores de compilación pr. acceso son: error C2274: 'molde de estilo de función': ilegal como el lado derecho de '.' operador error C2228: a la izquierda de '.otherdata' debe tener clase/estructura/unión He intentado varios cambios, pero ninguno exitoso.C++: sintaxis para acceder al miembro struct desde el puntero a la clase

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

Respuesta

15

Solo define una estructura allí, no asigna una. Prueba esto:

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

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

    cout << foo.mybar.otherdata; 

    return 0; 
} 

Si desea volver a utilizar la estructura en otras clases, también se puede definir la estructura exterior:

struct Bar { 
    int otherdata; 
}; 

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

Gracias, lo olvidé por completo. Y funciona como un encanto. –

+4

El código no es precisamente equivalente. En el primer ejemplo, el nombre de la estructura Bar es realmente Foo :: Bar. –

+0

Tienes razón, Neil, editó mi respuesta. – schnaader

8

Bar es la estructura interna definida en el interior Foo. La creación del objeto Foo no crea implícitamente los miembros Bar. Necesita crear explícitamente el objeto de Bar utilizando la sintaxis Foo::Bar.

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

De lo contrario,

crear la instancia de barra como miembro de Foo clase.

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

Me gusta más este estilo que el estilo tradicional de C "struct {} ". –

5

Crea una estructura anidada, pero nunca crea ninguna instancia dentro de la clase. Es necesario decir algo como:

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

A continuación, puede decir:

foo.bar.otherdata = 5; 
1

Sólo se está declarando Foo :: bar, pero no instanciarlo (no estoy seguro si ese es el término correcto)

ver aquí para el 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; 
    }; 

Aquí acaba de definir una estructura pero no ha creado ningún objeto de ella. Por lo tanto, cuando dice foo.Bar.otherdata = 5; es un error del compilador. Cree un objeto de struct Bar como Bar m_bar; y luego use Foo.m_bar.otherdata = 5;

Cuestiones relacionadas