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?

Foi útil?

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[];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top