2014-05-12 1 views
-3

J'ai un problème avec ma fonction d'appelréférence non définie à une erreur de méthode statique

static classname *makeclass (char ch, int x1, int y1, int x2, int y2){ 

    cin >> ch >> x1 >> y1 >> x2 >> y2; 
    Ship **ptr = 0; 
    if (ch != 'A' || ch != 'B' || ch != 'C' || ch != 'D'){ 
      throw invalid_argument ("Error : invalid character input "); 
    } 

    else if (ch == 'A'){ 
      classname **ptr = new derivedclassname*[5]; 
      for (int i = 0 ; i < 5; i++){ 
        ptr[i] = new derivedclass (x1,y1,x2,y2); 
      } 
      return *ptr; 
    } 

    return *ptr; 

} 

Dans mon fichier principal:

main() { 
classname *p = classname::*makeclass (x1,y1,x2,y2); 

} 

Mon erreur:

Ship.cpp:81:14: warning: ‘classname* makeclass(char, int, int, int, int)’ defined but not  used [-Wunused-function] 
static classname *makeclass (char ch, int x1, int y1, int x2, int y2){ 
     ^
/tmp/cc1eUoXA.o: In function `main': 
testclass.cpp:(.text+0xc1): undefined reference to `classname::makeclass(char, int, int, int, int)' 
+0

Malgré les divers problèmes avec la syntaxe, pourquoi la fonction 'makeclass' paramètres de passage vous car ils sont passés en valeur et remplis par l'appel 'cin' en dedans? – SirDarius

+0

'static' semble faux, sauf si vous avez cette en ligne dans une déclaration de classe! Sinon, l'éditeur de liens voit cela uniquement privé pour l'unité de compilation dans laquelle il a été défini. –

Répondre

0

Ce code a un lot des problèmes.

static classname *makeclass (char ch, int x1, int y1, int x2, int y2){ 

Cette fonction ne doit pas être statique, puisque, selon les informations fournies, il ne se trouve pas dans le même fichier que la fonction main.

En outre, vous ne devez même pas passer ces paramètres pour commencer, en raison de la ligne suivante:

cin >> ch >> x1 >> y1 >> x2 >> y2; 

Chacun d'entre eux doit être déclarée localement dans la fonction.

Ship **ptr = 0; 

Ce pointeur vers un pointeur de variable semble être assombris par une variable du même nom déclaré plus tard ... Cela devrait être évité à tout prix.

if (ch != 'A' || ch != 'B' || ch != 'C' || ch != 'D'){ 
      throw invalid_argument ("Error : invalid character input "); 
    } 

Ainsi, ch est valable si elle a en même temps les valeurs 'A', 'B', 'C' et 'D'. Comme il est, votre fonction lèvera toujours une exception ...

else if (ch == 'A'){ 
      classname **ptr = new derivedclassname*[5]; 

Cette déclaration ombrage une variable précédemment déclarée.

  for (int i = 0 ; i < 5; i++){ 
        ptr[i] = new derivedclass (x1,y1,x2,y2); 
      } 
      return *ptr; 

Supposons que vous vouliez dire derivedclassname au lieu de derivedclass. Ici, vous renvoyez un pointeur déréférencé vers le premier pointeur, ce qui signifie que vous ne renvoyez correctement que l'adresse du premier classname que vous avez créé.
Les quatre suivants sont perdus et vous avez créé une fuite de mémoire.

} 

    return *ptr; 

Ah, la meilleure partie vient en dernier, vous déréférencement d'un pointeur avec une valeur 0, ce qui est un comportement non défini et va probablement planter votre programme.

} 

Enfin, votre principale devrait ressembler à:

main() { 
    classname *p = makeclass (x1,y1,x2,y2); 
} 

puisque vous appelez simplement une fonction. Une fonction qui n'appartient PAS à une classe.

Questions connexes