Frage

Hier ist eine vereinfachte Version von dem, was ich habe (nicht funktioniert):

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;
}
...

Wenn ich versuche, zu bauen, bekomme ich folgende Fehlermeldung: Fehler C2228: links von '.length' muss Klasse / Struktur / Union haben

Der Fehler tritt nur dann, wenn ich versuche, Member-Funktionen der c_astrExamples zu verwenden. Wenn ich „c_astrExamples.length ()“ mit der Nummer 2 zu ersetzen, scheint alles richtig zu arbeiten.

Ich bin in der Lage, die Member-Funktionen von c_strExample1 und c_strExample2 zu verwenden, so dass ich denke, das Verhalten von gewissem Unterschied zwischen meiner Verwendung von Strings vs Arrays aus Strings entsteht.

Ist meine Initialisierung in prog.h falsch? Muss ich etwas Besonderes in prog.cpp?

War es hilfreich?

Lösung

Arrays in C ++ hat keine Member-Funktionen. Sie sollten eine Sammlung wie vector<string> verwenden, wenn Sie ein Objekt wünschen, oder berechnen Sie die Länge wie folgt:

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

Andere Tipps

Verwenden Sie einfach STL Vektor von Strings anstelle von 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();

Arrays in C ++ von C geerbt werden, die nicht objektorientiert. So sind sie keine Gegenstände und keine Mitgliederfunktionen haben. (In, dass sie verhalten sich wie int, float und den anderen integrierten Typen.) Von diesem Vorfahren mit Array weitere Probleme ergeben, wie die Tatsache, dass sie sich leicht (beispielsweise wenn sie in eine Funktion übergeben) Zerfall in einen Zeiger auf das erste Element ohne Größen links Informationen.

Der üblicher Rat ist std::vector stattdessen zu verwenden, die eine dynamisch veränderbare Array ist. Wenn Sie jedoch die Array-Größe zur Compile-Zeit bekannt, und Sie benötigen eine Konstante, dann Auftrieb des Array-Typ (boost::array, wenn Sie Compiler die Standarderweiterungen auch als std::tr1::array verfügbar TR1 unterstützt, std::array in der nächsten Version des C ++ Standard zu werden) ist das, was Sie wollen.

Bearbeiten 1 :

Ein sicherer Weg, um die Länge eines Arrays in C ++ beinhaltet eine unglaubliche Kombination von Vorlagen, Funktionszeigern und sogar ein Makro in den Mix geworfen zu bekommen:

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

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

Wenn Sie (wie ich) denken, das ist komisch, Blick auf

c_astrExamples ein Array ist, gibt es keine "length ()" Methode.

In C ++ Arrays sind keine Objekte und haben keine Methoden auf sie. Wenn Sie die Länge des Arrays erhalten Sie das folgende Makro verwenden könnten

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

Auch passen sie von der Initialisierung in einer Header-Datei. Sie riskieren den Linker zu verletzen.
Sie sollten:

prog.h:

extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];
scroll top