VS2008의 수업에서 정적 멤버, 예를 들어 정적 구조를 사용할 수없는 이유는 무엇입니까?
-
07-07-2019 - |
문제
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";
}