Pourquoi ne puis-je pas utiliser de membres statiques, par exemple des structures statiques, dans mes classes dans VS2008?

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

Question

Quand j'écris un code comme celui-ci dans 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() {}
};

J'initialise ensuite ma structure comme ceci:

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

Le compilateur génère les erreurs suivantes:

  

'Patterns': le symbole à gauche d'un '::' doit être un type 'ptSelect'   : n'est pas membre de 'QueryValidate'

Qu'est-ce que je fais mal? Est-ce un problème avec Visual Studio ou avec mon code? Je sais que les membres statiques, à l'exception des membres const, doivent être définis en dehors de la classe dans laquelle ils ont été déclarés.

Était-ce utile?

La solution

Vous essayez de créer un membre non statique (ptCreate) d'un membre statique (pts). Cela ne fonctionnera pas comme ça.

Vous avez deux options, soit utiliser une liste d'initialisation de structure pour la classe Patterns.

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

Ou bien, beaucoup plus sûr (et meilleur à mon avis), fournissez un constructeur dans Patterns et appelez-le.

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

D'un côté, votre code ne fonctionnerait dans aucun compilateur C ++, ce n'est pas un conflit avec Visual Studio.

Autres conseils

Vous pouvez uniquement initialiser la structure dans son ensemble, comme dans:

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

Ceci n'est pas valide C ++. Dans le fichier cpp, vous déclarez des parties de la structure statique "QueryValidate :: pts", mais ce n'est pas autorisé. Vous devez déclarer toute la structure, comme suit:

Patterns QueryValidate :: pts;

si vous souhaitez que les membres soient initialisés, vous les initialisez dans une autre méthode ou ajoutez un constructeur à Patterns qui prend tous les arguments d'initialisation de votre choix.

Je ne suis pas vraiment sûr de ce que vous essayez de faire ici. On dirait que vous essayez de déclarer et d'initialiser chaque champ de pts séparément, plutôt que de déclarer pts une fois en tant qu'objet unique. Je suis vraiment surpris que VS te laisse faire.

Ce qui a fonctionné pour moi dans gcc a été le suivant:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top