2011-04-18 15 views
6

He logrado inicializar correctamente cualquier variable de tipo básico (es decir, int, char, float, etc.) pero al declarar una pequeña variable compleja todo lo que puedo ver son errores.cómo inicializar una estructura estática en C++?

En el archivo de cabecera timer.hi declaran

class AndroidTimerConcept { 
... 
private: 
    //struct that holds the necessary info for every event 
    struct Resources{ 
     timer_delegate_t membFunct; 
     void *data; 
     int size; 
     millis_t time; 
    }; 
    //declaring an array of 10 Resources structs 
    static struct Resources ResData; 
    static int best; 
... 
} 

dentro del archivo timer.cpp

#include <iostream> 
#include "timer.h" 
using namespace std; 


int AndroidTimerModel::best=1000; 
struct Resources AndroidTimerModel::ResData.size; //line 17!! 
//constructor that initializes all the necessary variables 

AndroidTimerModel::AndroidTimerModel() 
{ 
    signal(SIGALRM,signalHandler); 

    for(int i=0; i<MAX_EVENTS; i++) 
    { 
     //ResData.data=NULL; 
     ResData.size=-1; 
     //ResData.time=-1; 
    } 

    best=1000; 

} 

al compilar el archivo .cpp me sale el error: timer.cpp: 7: error: inicializador esperado antes de '.' token

Cualquier sugerencia sería realmente útil.

por cierto yo uso g ++

Respuesta

-3

Por qué es su struct parte de una clase? Lo haría global fuera de la clase.

memset(&structname, 0, sizeof(structname)); se inicializar su estructura a 0.

4

Puede utilizar un inicializador struct en C++, pero sólo en el estilo pre-C99 (es decir, no se puede utilizar inicializadores designados). Inicializadores designados, que le permiten especificar los miembros que se inicializarán por nombre, en lugar de confiar en el orden de las declaraciones, se introdujeron en C99, pero no son parte de ningún estándar de C++ en este momento (contradiciendo la suposición común de que C++ es un superconjunto de C).

Si está dispuesto a escribir código C++ no portátil que apunta específicamente a g ++, siempre puede usar el GCC-specific extension que tiene la misma funcionalidad que los constructores designados. La sintaxis es la siguiente:

struct value_t my_val = { member_a: 1, member_b: 1.2f }; 

This reference proporciona una buena visión general de los dos tipos de inicialización en el contexto C.

He aquí un extracto que muestra ambos estilos el anterior (sin que designadores) y C99:

When initializing a struct, the first initializer in the list initializes the first declared member (unless a designator is specified) (since C99), and all subsequent initializers without designators (since C99) initialize the struct members declared after the one initialized by the previous expression.

struct point {double x,y,z;} p = {1.2, 1.3}; // p.x=1.2, p.y=1.3, p.z=0.0 
div_t answer = {.quot = 2, .rem = -1 };  // order of elements in div_t may vary 

En algunos casos puede que tenga que escribir algo de código para inicializar una estructura, y en este caso se puede utilizar el resultado de una función, como:

struct Resources AndroidTimerModel::ResData = function_that_acts_like_a_constructor(); 
+0

Su enlace ya no funciona, aunque su respuesta sigue siendo valioso para las personas que tienen el mismo problema. ¿Puedes actualizarlo? – VisorZ

+0

Actualicé el enlace a uno que es poco probable que se pudra e incluí un extracto en la pregunta esta vez. – BeeOnRope

0

Es necesario para inicializar la variable entera estructura, algo como esto:

AndroidTimerConcept::Resources AndroidTimerModel::ResData = { NULL, NULL, 0, 0 }; 
+0

Ese inicializador no tiene ningún efecto, todas las variables con tiempo de vida estático se inicializan en cero antes de que comience la ejecución. –

+1

Es cierto, aunque si OP quiere inicializar cualquiera de los campos con un valor distinto de cero, esta es la sintaxis que se debe usar. – pmdj

1

Debe declarar y definir un constructor para la estructura Resources. por ejemplo

struct Resources{ 
    timer_delegate_t membFunct; 
    void *data; 
    int size; 
    millis_t time; 
    Resources():membFunct(0), data(0), size(0), time(0) {} 
    .... 
}; 
+0

Útil si 'Resources' alguna vez se usa para declarar una variable con duración automática o de miembro. –

+0

o como una variable 'estática'. – quamrana

+0

Las variables con duración estática ya no se inicializan en cero, no es necesario escribir un constructor para eso. –

6

Aún no se define por separado los miembros de instancias individuales dentro de un miembro estático.

Esto debería ser suficiente:

AndroidTimerModel::Resources AndroidTimerModel::ResData; 
+0

Gracias que funcionó: D – filippos

+0

@filippos marcó la solución-respuestas aceptadas :) –

0

¿Es AndroidTimerModel o AndroidTimerConcept, no se puede utilizar diferentes nombres y esperar que el compilador para pensar que son la misma cosa.

Necesitas alcance los recursos de nombre, no es de alcance mundial, que es en el ámbito de la clase AndroidTimerModel:

AndroidTimerModel::Resources AndroidTimerModel::ResData; 

le sugiero que da recursos que un constructor:

struct Resources{ 
    Resources(timer_delegate_t aMembFunct, void* aData, int aSize, millis_t aTime) 
     : membFunc(aMembFunct) 
     , data(aData) 
     , size(aSize) 
     , time(aTime) 
    {} 
    timer_delegate_t membFunct; 
    void *data; 
    int size; 
    millis_t time; 
}; 

Y a continuación, puede definir Res en su .cpp como:

AndroidTimerModel::Resources AndroidTimerModel::ResData(/* params here */); 
+0

lo siento es que apareció el concepto de AndroidTimerModel porque no copié la primera línea del encabezado al publicar la pregunta .. – filippos

Cuestiones relacionadas