Como faço para usar funções de membro de matrizes constantes em C ++?
Pergunta
Aqui está uma versão simplificada do que eu tenho (não funciona):
prog.h:
...
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
const string c_astrExamples[] = {c_strExample1, c_strExample2};
...
prog.cpp:
...
int main()
{
int nLength = c_astrExamples.length();
for (int i = 0; i < nLength; i++)
cout << c_astrExamples[i] << "\n";
return 0;
}
...
Quando tento construir, eu recebo o seguinte erro: erro C2228: esquerda '.length' deve ter classe / struct / união
O erro ocorre somente quando eu tento usar funções de membro das c_astrExamples. Se eu substituir "c_astrExamples.length ()" com o número 2, aparece que tudo funcione corretamente.
Eu sou capaz de usar as funções de membro de c_strExample1 e c_strExample2, então eu acho que o comportamento decorre de alguma diferença entre o meu uso de cordas contra matrizes de strings.
É a minha iniciação na errado prog.h? Preciso de algo especial em prog.cpp?
Solução
Arrays em C ++ não tem funções de membro. Você deve usar uma coleção como vector<string>
se você quer um objeto, ou calcular o comprimento assim:
int nLength = sizeof(c_astrExamples)/sizeof(c_astrExamples[0]);
Outras dicas
Apenas uso STL vector de strings em vez de array:
#include <string>
#include <vector>
using namespace std;
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
vector<string> c_astrExamples;
c_astrExamples.push_back(c_strExample1);
c_astrExamples.push_back(c_strExample2);
int main()
{
int nLength = c_astrExamples.size();
matrizes em C ++ são herdados a partir de C, que não foi orientada para o objecto. não Então, eles são objetos e não tem funções de membro. (No que se comportam como int
, float
e a outra incorporada na tipos.) Desde que ascendência haste mais problemas com a matriz, como o facto de eles facilmente (por exemplo, quando passado para uma função) decaimento em um ponteiro para o primeiro elemento sem informações de tamanho esquerda.
O conselho habitual é usar std::vector
em vez disso, que é uma matriz dinamicamente redimensionável. No entanto, se você o tamanho da matriz é conhecido em tempo de compilação e você precisa de uma constante, em seguida, tipo de matriz de impulso (boost::array
, se o seu compilador suporta os TR1 extensões padrão também disponível como std::tr1::array
, para se tornar std::array
na próxima versão do padrão C ++) é o que você quer.
Editar 1 :
Uma maneira segura para obter o comprimento de uma matriz em C ++ envolve uma combinação incrível de modelos, ponteiros de função e até mesmo uma macro jogado na mistura:
template <typename T, std::size_t N>
char (&array_size_helper(T (&)[N]))[N];
#define ARRAY_SIZE(Array_) (sizeof( array_size_helper(Array_) ))
Se você (como eu) acho que isso é hilário, olhada boost::array
.
Editar 2 :
Como dribeas disse em um comentário, se você não precisa de uma constante em tempo de compilação, este
template <typename T, std::size_t N>
inline std::size_t array_size(T(&)[N])
{return N;}
é suficiente (e muito mais fácil de ler e entender).
c_astrExamples é uma matriz, não há um "comprimento ()" método nela.
matrizes em C ++ não são objetos e não têm métodos sobre ele. Se você precisa para obter o comprimento da matriz, você poderia usar o seguinte macro
#define COUNTOF( array ) ( sizeof( array )/sizeof( array[0] ) )
int nLength = COUNTOF(c_astrExamples);
Além disso, cuidado de inicialização em um arquivo de cabeçalho. Corre o risco de ofender o vinculador.
Você deve ter:
prog.h:
extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];