2011-10-31 1 views
0

Actuellement j'apprends le C++ dans mon livre et ils ont eu un exercice sur l'utilisation d'une classe précédemment créée appelée IntList et l'implémentent en utilisant IntListProxy. Mon livre ne parle que des procurations dans un exemple très simple, donc j'ai du mal avec la syntaxe. Qu'est-ce que je fais de mal avec ce proxy et comment puis-je le réparer? Gardez à l'esprit IntList est déjà un .o et je ne suis pas autorisé à inclure IntList.cpp lorsque je compile ceci. L'erreur:Erreurs de syntaxe avec les proxies: Que fais-je de mal?

IntListProxy.cpp: In member function ‘bool IntListProxy::isEmpty()’: 
IntListProxy.cpp:7: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘IntListProxy* IntListProxy::prepend(int)’: 
IntListProxy.cpp:13: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘int IntListProxy::head()’: 
IntListProxy.cpp:19: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘IntListProxy* IntListProxy::tail()’: 
IntListProxy.cpp:25: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘std::string IntListProxy::toString()’: 
IntListProxy.cpp:31: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘int IntListProxy::length()’: 
IntListProxy.cpp:37: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘IntListProxy*  `IntListProxy::append(IntListProxy*)’:` 
IntListProxy.cpp:43: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp: In member function ‘int IntListProxy::operator[](int)’: 
IntListProxy.cpp:49: error: invalid use of incomplete type ‘struct IntList’ 
IntListProxy.h:5: error: forward declaration of ‘struct IntList’ 
IntListProxy.cpp:51: error: expected unqualified-id before ‘}’ token 
IntListProxy.cpp:51: error: expected ‘;’ before ‘}’ token 

IntListProxy.h

#include <iostream> 
#include <string> 

using namespace std; 
class IntList; 

class IntListProxy 
{ 
public: 
    IntListProxy(); 
    bool isEmpty(); 
    IntListProxy *prepend(int n); 
    int head(); 
    IntListProxy *tail(); 
    string toString(); 
    int length(); 
    IntListProxy *append(IntListProxy *lst); 
    int operator[](int n); 
private: 
    IntList *ptr; 

}; 

IntListProxy.cpp

#include "IntListProxy.h" 

IntListProxy::IntListProxy(){} 

bool IntListProxy::isEmpty(){ 

    ptr->isEmpty(); 

} 

IntListProxy *IntListProxy::prepend(int n){ 

    return ptr->prepend(n); 

} 

int IntListProxy::head(){ 

    return ptr->head(); 

} 

IntListProxy *IntListProxy::tail(){ 

    return ptr->tail(); 

} 

string IntListProxy::toString(){ 

    return ptr->toString(); 

} 

int IntListProxy::length(){ 

    return ptr->length(); 

} 

IntListProxy *IntListProxy::append(IntListProxy *lst){ 

    return ptr->append(lst); 

} 

int IntListProxy::operator[](int n){ 

    return ptr->operator[](n); 

} 

Merci d'avance!

Répondre

2

Solution proposée:
Vous devez inclure le fichier d'en-tête qui définit la classe IntList dans votre fichier cpp IntListProxy.cpp.

Explication:
Quand au lieu d'inclure le fichier d'en-tête vous ajoutez la ligne:

class IntList; 

It Forward déclare la classe IntList qui signifie pour le compilateur est un type incomplet. Avec des types incomplets, on ne peut pas en créer des objets ou faire quoi que ce soit qui nécessite que le compilateur connaisse la disposition de IntList ou plus que le fait que IntList soit juste un type. i.e: Le compilateur ne sait pas quels sont ses membres et quelle est sa disposition de la mémoire. Mais comme les pointeurs vers tous les objets ont besoin de la même allocation de mémoire, vous pouvez utiliser la déclaration forward lorsque vous renvoyez juste à un type incomplet comme pointeur.

Dans ce cas votre fichier cpp IntListProxy.cpp doit connaître la disposition (membres) de IntList pour pouvoir le déréférencer et donc l'erreur.

0

À la ligne 7, où vous appelez isEmpty, IntList a seulement été déclaré à l'avance. Le compilateur n'a pas encore vu la définition réelle de la classe.

0

Vous venez de faire suivre la déclaration IntList. Le compilateur ne sait pas quelles méthodes existent dans ce struct. Par conséquent, vous devez inclure le fichier d'en-tête qui contient la définition de IntList dans le fichier proxy cpp.