¿Por qué no puedo usar miembros estáticos, por ejemplo estructuras estáticas, en mis clases en VS2008?

StackOverflow https://stackoverflow.com/questions/272161

Pregunta

Cuando escribo código como este en VS 2008:

.h
struct Patterns {
        string ptCreate;
        string ptDelete;
        string ptDrop;
        string ptUpdate;
        string ptInsert;
        string ptSelect;
    };     

class QueryValidate {
    string query;
    string pattern;
    static Patterns pts;
public:
    friend class Query;
    QueryValidate(const string& qr, const string& ptn):
      query(qr), pattern(ptn) {}
    bool validate() {
        boost::regex rg(pattern);
        return boost::regex_match(query, rg);
    }
    virtual ~QueryValidate() {}
};

Luego inicializo mi estructura de esta manera:

.cpp
string QueryValidate::pts::ptCreate = "something";
string QueryValidate::pts::ptDelete = "something";
//...

El compilador da los siguientes errores:

  

'Patrones': el símbolo a la izquierda de un '::' debe ser un tipo 'ptSelect'   : no es miembro de 'QueryValidate'

¿Qué estoy haciendo mal? ¿Es este un problema con Visual Studio o con mi código? Sé que los miembros estáticos, excepto los const, deben definirse fuera de la clase en la que se declararon.

¿Fue útil?

Solución

Está intentando crear un miembro no estático (ptCreate) de un miembro estático (pts). Esto no funcionará así.

Tienes dos opciones, ya sea usar una lista de inicializador de estructura para la clase Patterns.

Patterns QueryValidate::pts = {"CREATE", "DELETE"}; // etc. for every string

O, mucho más seguro (y mejor en mi opinión), proporciona un constructor en Patterns y llámalo.

struct Patterns {
   Patterns() { /*...*/ }
   /* ... */
}

Por otro lado, su código no funcionaría en ningún compilador de C ++, no es un conflicto con las cosas de Visual Studio.

Otros consejos

Solo puede inicializar la estructura como un todo, como en:

Patterns QueryValidate::pts = { "something", "something", ... };

Esto no es válido en C ++. En el archivo cpp está declarando partes de la estructura estática " QueryValidate :: pts " ;, pero eso no está permitido: debe declarar toda la estructura, así:

Patrones QueryValidate :: pts;

si desea que los miembros se inicialicen, puede inicializarlos en otro método o agregar un constructor a Patterns que tome los argumentos de inicialización que desee.

No estoy muy seguro de lo que estás tratando de hacer aquí. Parece que está intentando declarar e inicializar cada campo en pts por separado, en lugar de declarar pts una vez como un solo objeto. Estoy realmente sorprendido de que VS te permita hacer eso.

Lo que funcionó para mí en gcc fue lo siguiente:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top