2010-11-16 15 views
2

Je ne comprends pas pourquoi mon compilateur me donne ces erreurs:ne peut pas déclarer un pointeur vers 'classe const & FOO' erreur

brain.cpp:16: error: cannot declare pointer to ‘const class FACT&’ 
brain.cpp: In constructor ‘FACT::FACT(const FACT*)’: 
brain.cpp:20: error: cannot convert ‘FACT**’ to ‘FACT*’ in assignment 
brain.cpp: In member function ‘void FACT::AddRelation(FACT*)’: 
brain.cpp:29: error: expected type-specifier before ‘*’ token 
brain.cpp:29: error: cannot convert ‘int**’ to ‘FACT*’ in initialization 
brain.cpp:29: error: expected ‘,’ or ‘;’ before ‘FACT’ 
brain.cpp:35: error: expected type-specifier before ‘*’ token 
brain.cpp:35: error: cannot convert ‘int**’ to ‘FACT*’ in assignment 
brain.cpp:35: error: expected ‘;’ before ‘FACT’ 
brain.cpp: At global scope: 
brain.cpp:47: error: expected unqualified-id before ‘=’ token 
brain.cpp:48: error: expected type-specifier before ‘*’ token 
brain.cpp:48: error: cannot convert ‘int**’ to ‘FACT*’ in initialization 
brain.cpp:48: error: expected ‘,’ or ‘;’ before ‘FACT’ 
brain.cpp: In function ‘void AddFact(FACT*)’: 
brain.cpp:52: error: cannot convert ‘FACT**’ to ‘FACT*’ in initialization 
brain.cpp:58: error: expected type-specifier before ‘*’ token 
brain.cpp:58: error: cannot convert ‘int**’ to ‘FACT*’ in assignment 
brain.cpp:58: error: expected ‘;’ before ‘FACT’` 

#include <iostream> 
using namespace std; 
class FACT 
{ 
    public: 
     FACT(string f) 
     { 
      fact=f; 
      relations=NULL; 
      num_relations=0; 
     }; 
     ~FACT() 
     { 
      delete[] relations; 
     }; 
     FACT(const FACT& *copy) 
     { 
      num_relations=copy->num_relations; 
      delete[] relations; 
      relations=new FACT*[num_relations]; 
      for (int x=0; x<=num_relations; x++) 
      { 
       relations[x]=copy->relations[x]; 
      } 
      fact=copy->fact; 
     }; 
     void AddRelation(FACT *fact) 
     { 
      FACT *copy=new *FACT[num_relations]; 
      for (int x=0; x<=num_relations; x++) 
      { 
       copy[x]=relations[x]; 
      } 
      delete[] relations; 
      relations=new *FACT[num_relations+1]; 
      for (int x=0; x<=num_relations; x++) 
      { 
       relations[x]=copy[x]; 
      } 
      relations[num_relations+1]=fact; 
      num_relations++; 
     }; 
     string fact; 
     FACT *relations; 
     int num_relations; 
}; 
FACT *facts=new *FACT[0]; 
int num_facts=0; 
void AddFact(FACT *new_item) 
{ 
    FACT *copy=new FACT*[num_facts]; 
    for (int x=0; x<=num_facts; x++) 
    { 
     copy[x]=facts[x]; 
    } 
    delete[] facts; 
    facts=new *FACT[num_facts+1]; 
    for (int x=0; x<=num_facts; x++) 
    { 
     facts[x]=copy[x]; 
    } 
    delete[] copy; 
    num_facts++; 
    facts[num_facts]=new_item; 
} 
int main() 
{ 
    FACT *new_item=new FACT("linux is secure"); 
    AddFact(new_item); 
    delete[] facts; 
    return 0; 
} 

J'utilise g ++ 4.4.3 je peux comprends pas pourquoi il ne considère pas « FACT » être un type de données

Répondre

4

vous ne pouvez pas déclarer un pointeur vers une référence, comme vous essayez de le faire ici:

FACT(const FACT& *copy) 

Il n'y a pas de pointeurs vers une référence. Probablement que vous vouliez juste une référence, sans pointeur:

FACT(const FACT& copy) 
+0

Je pensais que la façon dont était vous avez fait le constructeur de la copie – noah

+0

@noah: C'est fait sans le '*'. – sth

1

Eh bien, votre première erreur est ici:

FACT(const FACT& *copy) 

Ne peut pas faire cela, vous voulez une référence

FACT(const FACT& copy) 
2

Vous essayez de déclarer un constructeur de copie. Cependant ce n'est pas correct.

Un constructeur de copie est déclarée conformément au-dessous de citation de la norme

12,8/2 $ - « Un constructeur non-template pour la classe X est un constructeur de copie si premier paramètre est de type X &, const X &, volatile X & ou const X & volatile, et soit il n'y a pas d'autres paramètres ou bien tous les autres paramètres ont des arguments par défaut (8.3.6) « .

Le paramètre du constructeur 'censé être copié' a le type 'pointeur vers la référence'. Ce n'est pas autorisée par la norme selon la citation ci-dessous

8.3.2 $/5- « Il n'y aura pas références à des références, pas de tableaux de références , et pas de pointeurs à références. »

+0

+1, plus complet que ma réponse –

1

Salut, les gens. Ce n'est pas toute la vérité.

Bien sûr @noah ne peut pas déclarer

un pointeur vers une référence

, mais l'inverse, une référence à un pointeur, est autorisé.

FACT(const FACT *&copy) 

est une syntaxe valide et très utile dans certaines situations. Bien que, il est toujours un mauvais constructeur de copie.

Il y a des couples de bonnes pages enseigner ceci:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr390.htm http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html http://cplus.about.com/od/learning1/ss/constructors.htm