Por que eu não posso usar membros estáticos, destinados a estruturas exemplo estáticos, em minhas aulas no VS2008?
-
07-07-2019 - |
Pergunta
Quando eu escrever um código como este no 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() {}
};
Em seguida, inicializar o meu estrutura como esta:
.cpp
string QueryValidate::pts::ptCreate = "something";
string QueryValidate::pts::ptDelete = "something";
//...
O compilador dá os seguintes erros:
'padrões': O símbolo à esquerda de um '::' deve ser um tipo 'ptSelect' : Não é um membro de 'QueryValidate'
O que estou fazendo de errado? É este um problema com Visual Studio ou com o meu código? Eu sei que os membros estáticos, exceto para aqueles const deve ser definido fora da classe que foram declarados no.
Solução
Você está tentando criar um membro não-estático (ptCreate) de um membro estática (pts). Isso não vai funcionar assim.
Você tem duas opções, ou usar um struct initializer lista para a classe padrões.
Patterns QueryValidate::pts = {"CREATE", "DELETE"}; // etc. for every string
Ou, muito mais seguro (e melhor na minha opinião), fornecer um construtor em padrões e chamada que um.
struct Patterns {
Patterns() { /*...*/ }
/* ... */
}
Em um lado não, seu código não funcionaria em qualquer compilador C ++, não é um conflito com o Visual Studio coisas.
Outras dicas
Você só pode inicializar a estrutura como um todo, como em:
Patterns QueryValidate::pts = { "something", "something", ... };
Este não é válido C ++. No arquivo CPP você está declarando partes da estrutura estática "QueryValidate :: pts", mas isso não é permitido: você tem de declarar toda a estrutura, assim:
Patterns QueryValidate :: pts;
Se você quer que os membros de ser inicializado, você quer inicializar-los em outro método, ou adicionar um construtor para Padrões que toma o que quer argumentos de inicialização que você deseja.
Eu não estou realmente certo o que você está tentando fazer aqui. Parece tipo de como você está tentando declarar e inicializar cada campo no pts separadamente, ao invés de pts de declaração de uma vez como um único objeto. Estou realmente surpreso VS permite que você faça isso.
O que funcionou para mim no gcc foi o seguinte:
Patterns QueryValidate::pts;
void foo () {
QueryValidate::pts.ptCreate = "something";
QueryValidate::pts.ptDelete = "something";
}