error C2027: Verwendung des undefinierten Typs - wie Sie erklären-Klasse
Habe ich folgende Fehlermeldung, wenn ich nur die definition der Klasse zuerst und dann erkläre es später. Mein Verständnis war, solange wir das tun, wie ich es schon unzählige Male für die definition einer Funktion, der compiler bekommt, es scheint aber mein Verständnis ist fehlerhaft kann mir jemand helfen zu verstehen, was fehlende Teil zu verstehen wie zu erklären. Klasse.
error C2027: use of undefined type 'generic_iterator'
note: see declaration of 'generic_iterator
Funktioniert nicht - Fehler oben gezeigt
#include <iostream>
class generic_iterator;
class darray
{
public:
typedef generic_iterator iterator;
darray();
darray(int size);
~darray();
int& at(int index);
int& operator [](int i);
int* data(void);
bool empty();
void fill(int val);
void print();
size_t max_size();
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
private:
int *ptrarray;
int num_elements;
int size;
};
class generic_iterator
{
public:
generic_iterator(int *ptr);
~generic_iterator();
generic_iterator& operator++(); //pre-increment
generic_iterator operator++(int); //post-increment
private:
int *iptr;
};
Funktioniert : Wenn die ganze Klasse, wird zuerst deklariert
class generic_iterator
{
public:
generic_iterator(int *ptr);
~generic_iterator();
generic_iterator& operator++(); //pre-increment
generic_iterator operator++(int); //post-increment
private:
int *iptr;
};
class darray
{
public:
typedef generic_iterator iterator;
darray();
darray(int size);
~darray();
int& at(int index);
int& operator [](int i);
int* data(void);
bool empty();
void fill(int val);
void print();
size_t max_size();
iterator begin() {return iterator(ptrarray); }
iterator end() { return iterator(ptrarray + size); }
private:
int *ptrarray;
int num_elements;
int size;
};
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie erklären, eine Zusammenfassung von etwas, bevor Sie es verwenden, dies wird als vorwärts-Deklaration.
Wenn eine vorwärts-Deklaration einer Funktion der compiler hat alles, was es braucht, um zu analysieren, code ruft die Funktion: der name der Funktion, den Typ zurückgegeben, die Anzahl der Argumente und den Typ jedes Arguments.
Aber, wenn eine vorwärts-Deklaration einer Klasse, der compiler weiß nur, dass dieses bestimmte symbol (
generic_iterator
in deinem Fall) ist eine Klasse. Später, die einzige Sache, die Sie tun können, bevor er vollständig definiert ist, um einen Zeiger zu deklarieren, um es. (Und Leute mit mehr Kenntnis von C++, als ich vielleicht wissen, ein oder zwei zusätzliche Arkane verwendet.) Sie können nicht aufrufen, eines seiner Mitglieder, da der compiler noch nicht wissen, wie seine Struktur. Ihr code versucht, ruft den Konstruktor des vorwärts-referenzierten Klasse, aber der compiler nicht weiß, von solchen Konstruktor noch.Ich kenne keinen einfachen Weg, um dieses problem zu beheben. Andere haben vielleicht einige bessere Lösungen, aber die Art, wie ich neigen dazu, dieses problem zu beheben ist, indem Sie alle der code, der benötigt Zugriff auf die Mitglieder einer forwardly deklariert-Klasse aus der
.h
- Datei, um die.cpp
- Datei. Also, in deinem Fall, in der.h
Datei würde ich einfach schreibeniterator begin();
und dann in die.cpp
- Datei würde ich schreibengeneric_iterator darray::begin() {return iterator(ptrarray); }
.Diese zusammenstellen würde, weil in diesem moment die komplette Klassendefinition von
generic_iterator
bekannt ist.Muss der compiler wissen, die definition der Klasse
generic_iterator
erreichte er in der Analyse diese Funktion DefinitionenSonst ist es nicht in der Lage zu sagen, ob dieser code korrekt ist, d.h. ob die Klasse
generic_iterator
hat einen Konstruktor, der aufgerufen werden kann, mit einem argument.Berücksichtigen, dass es richtig wäre deklarieren Sie eine Konstante subskript-operator zusammen mit den nicht-Konstanten-operator. Zum Beispiel
oder
Versuchen Sie auch die Verwendung der qualifier
const
mit den Funktionen, die ändern sich nicht mit dem Objekt selbst, wie zum Beispielempty
odermax_size
oder vielleichtprint