VS2008의 수업에서 정적 멤버, 예를 들어 정적 구조를 사용할 수없는 이유는 무엇입니까?

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

문제

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() {}
};

그런 다음 다음과 같이 내 구조를 초기화합니다.

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

컴파일러는 다음과 같은 오류를 제공합니다.

'패턴': a '::'왼쪽의 기호는 'ptselect'유형이어야합니다. 'QueryValidate'의 구성원이 아닙니다.

내가 뭘 잘못하고 있죠? 이것은 Visual Studio 또는 내 코드에 문제가 있습니까? 나는 const를 제외한 정적 멤버를 제외한 정적 멤버는 그들이 선언 한 클래스 밖에서 정의되어야한다는 것을 알고 있습니다.

도움이 되었습니까?

해결책

정적 멤버 (PTS)의 비 정적 멤버 (PTCreate)를 만들려고합니다. 이것은 이렇게 작동하지 않습니다.

패턴 클래스에 구조 초기화 목록을 사용하는 두 가지 옵션이 있습니다.

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

또는 훨씬 더 안전하고 (내 의견으로는 더 나은) 패턴의 생성자를 제공하고 그것을 호출하십시오.

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

한 측면에서는 코드가 C ++ 컴파일러에서 작동하지 않으며 Visual Studio와 충돌하지 않습니다.

다른 팁

다음과 같이 구조를 전체적으로 초기화 할 수 있습니다.

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

이것은 유효한 C ++가 아닙니다. CPP 파일에서 정적 구조 "QueryValidate :: pts"의 일부를 선언하지만 허용되지 않습니다. 전체 구조를 다음과 같이 선언해야합니다.

패턴 queryValidate :: pts;

멤버를 초기화하려면 다른 방법으로 초기화하거나 원하는 초기화 인수를 취하는 패턴에 생성자를 추가합니다.

나는 당신이 여기서 무엇을하려고하는지 잘 모르겠습니다. PTS를 단일 객체로 한 번 선언하는 대신 각 필드를 PTS로 개별적으로 선언하고 초기화하려고하는 것처럼 보입니다. 나는 정말 놀랐다.

GCC에서 저를 위해 일한 것은 다음과 같습니다.

Patterns QueryValidate::pts;

void foo () {
    QueryValidate::pts.ptCreate = "something";
    QueryValidate::pts.ptDelete = "something";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top