Warum kann nicht verwende ich statische Elemente, zum Beispiel statische Strukturen, in meinem Unterricht in VS2008?

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

Frage

Wenn ich schreibe Code wie folgt in 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() {}
};

ich dann meine Struktur wie folgt initialisieren:

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

Der Compiler gibt die folgenden Fehler:

  

‚Patterns‘: das Symbol links von einem ‚::‘ muss eine Art ‚ptSelect‘ sein   : Ist kein Mitglied von 'QueryValidate'

Was mache ich falsch? Ist das ein Problem mit Visual Studio oder mit meinem Code? Ich weiß, dass statische Mitglieder mit Ausnahme von const diejenigen, müssen außerhalb der Klasse definiert werden, die sie in deklariert wurden.

War es hilfreich?

Lösung

Sie versuchen, ein nicht-statisches Element (ptCreate) ein statischen Elements (pts) zu erstellen. Dies wird nicht arbeiten.

Sie haben zwei Möglichkeiten, entweder eine Struktur Initialisiererliste für die Muster-Klasse verwenden.

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

Oder viel sicherer (und meiner Meinung nach besser), einen Konstruktor in Patterns liefern und dass man nennen.

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

Auf einer Seite nicht, Ihr Code würde in jedem C ++ Compiler nicht funktioniert, es ist nicht ein Konflikt mit Visual Studio Dingen.

Andere Tipps

Sie können nur die Struktur als Ganzes initialisieren, wie in:

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

Dies gilt nicht, C ++. In der CPP-Datei sind Sie Teile der statischen Struktur „QueryValidate :: Punkte“ erklärt, aber das erlaubt ist, nicht: Sie haben die ganze Struktur zu erklären, etwa so:

Muster QueryValidate :: pts;

Wenn Sie Mitglieder initialisiert werden soll, entweder Sie sie in einem anderen Verfahren initialisieren, oder einen Konstruktor Muster hinzufügen, die wollen, was die Initialisierung Argumente Sie hinführt.

Ich bin nicht wirklich sicher, was Sie versuchen, hier zu tun. Es sieht ein bisschen wie Sie versuchen, jedes Feld in pts separat zu deklarieren und zu initialisieren, anstatt zu erklären pts einmal als ein einzelnes Objekt. Ich bin wirklich überrascht VS können Sie das tun.

Was für mich in gcc arbeitete, war die folgende:

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top