Domanda

Ecco una versione semplificata di ciò che ho (non funziona):

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 provo a compilare, ottengo il seguente errore: errore C2228: a sinistra di '.length' deve essere class / struct / union

L'errore si verifica solo quando provo ad usare le funzioni membro di c_astrExamples. Se sostituisco & Quot; c_astrExamples.length () & Quot; con il numero 2, tutto sembra funzionare correttamente.

Sono in grado di utilizzare le funzioni membro di c_strExample1 e c_strExample2, quindi penso che il comportamento derivi da una certa differenza tra il mio uso di stringhe e le matrici di stringhe.

La mia inizializzazione in prog.h è errata? Ho bisogno di qualcosa di speciale in prog.cpp?

È stato utile?

Soluzione

Le matrici in C ++ non hanno funzioni membro. Dovresti usare una raccolta come vector<string> se vuoi un oggetto, o calcolare la lunghezza in questo modo:

int nLength = sizeof(c_astrExamples)/sizeof(c_astrExamples[0]);

Altri suggerimenti

Usa vettore STL di stringhe anziché di matrice:

#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();

Le matrici in C ++ sono ereditate da C, che non era orientato agli oggetti. Quindi non sono oggetti e non hanno funzioni membro. (In quanto si comportano come int, float e gli altri tipi incorporati.) Da quel lignaggio derivano più problemi con l'array, come il fatto che facilmente (ad esempio, quando vengono passati in una funzione) decadono in un puntatore al primo elemento senza informazioni sulla dimensione rimaste.

Il solito consiglio è usare invece std::vector, che è un array ridimensionabile dinamicamente. Tuttavia, se la dimensione dell'array è nota al momento della compilazione e hai bisogno di una costante, allora tipo di array boost (boost::array, se il tuo compilatore supporta le estensioni standard TR1 disponibili anche come std::tr1::array, per diventare std::array nella prossima versione dello standard C ++) è ciò che volere.

Modifica 1 :

Un modo sicuro per ottenere la lunghezza di un array in C ++ implica un'incredibile combinazione di template, puntatori di funzioni e persino una macro lanciata nel mix:

template <typename T, std::size_t N>
char (&array_size_helper(T (&)[N]))[N];

#define ARRAY_SIZE(Array_) (sizeof( array_size_helper(Array_) ))

Se (come me) pensi che sia divertente, guarda <=> .

Modifica 2 :

Come diceva Dribeas in un commento, se non hai bisogno di una costante di compilazione, questo

template <typename T, std::size_t N>
inline std::size_t array_size(T(&)[N])
{return N;}

è sufficiente (e molto più facile da leggere e comprendere).

c_astrExamples è un array, non esiste " length () " metodo in esso.

In C ++ le matrici non sono oggetti e non hanno metodi su di esso. Se è necessario ottenere la lunghezza dell'array, è possibile utilizzare la seguente macro

#define COUNTOF( array ) ( sizeof( array )/sizeof( array[0] ) )
int nLength = COUNTOF(c_astrExamples);

Inoltre, fai attenzione all'inizializzazione in un file di intestazione. Rischi di offendere il linker.
Dovresti avere:

prog.h:

extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top