2016-02-17 3 views
-3

Je suis un débutant en C++. J'apprends les fonctions d'ami de sujet. J'ai le code ci-dessous dans lequel deux fonctions friend sont déclarées dans la classe et appelées par le constructeur mais une erreur montre que les fonctions membres d'amis déclarées ne sont pas déclarées dans la portée. Qu'est-ce que je fais mal ici? voici mon code:Pourquoi l'erreur "non déclaré dans cette étendue" s'affiche-t-elle?

#include <iostream.h> 

class Salary 
{ 
private: 
    int sal[10]; 

public: 
    friend void add_details(); 
    void display(); 
    friend void display_des(); 

    Salary() 
    { 
      add_details(); 
    } 
}; 

void add_details() 
{ 
    int loop = 0; 

    for(loop=0;loop<10;loop++) 
    { 
      cin >> sal[loop]; 
      if (sal[loop] <= 0) 
      { 
       cout << "The amount should be greater than 0" << endl; 
       loop = loop - 1; 
       continue; 
      } 
    } 
} 

void display_des() 
{ 
    int sal_des[10]; 
    int loop1 = 0, loop2; 

    for(loop1=0; loop1<10; loop1++) 
    { 
      sal_des[loop1] = sal[loop1]; 
    } 

    for (loop1=0; loop1<10; loop1++) 
    { 
      for(loop2=loop1+1; loop2<10; loop2++) 
      { 
       if (sal_des[loop1]< sal_des[loop2]) 
       { 
        int temp; 
        temp = sal_des[loop1]; 
        sal_des[loop1] = sal_des[loop2]; 
        sal_des[loop2] = temp; 
       } 
      } 
    } 

    for(loop1=0; loop1<10; loop1++) 
    { 
      cout << sal_des[loop1]; 
    } 
} 

int main() 
{ 
    Salary sal1; 
    sal1.display_des(); 
    return 0; 
} 

En outre, une autre erreur dans la fonction display_des() apparaît comme sal n'est pas déclarée dans ce champ

+1

fonction ami = fonction membre!. Vous n'avez pas d'instance de Salary dans ces fonctions. – LogicStuff

+0

Essayez-vous réellement d'implémenter des fonctions membres ou des fonctions ami? –

Répondre

2

Vous définissez une fonction globale

void display_des(); 

au lieu du membre fonction

void Salary::display_des(); 

Cela signifie que display_des n'a pas de "ceci" - Salaire-objet à partir duquel il pourrait prendre le membre sal []. Vous ne lui passez pas non plus un objet Salaire de l'extérieur, alors quel sal devrait-il utiliser?

Donc, soit vous utilisez une fonction ami comme ceci:

void display_des(Salary& obj){ 
    obj.sal[...]... 
} 

Ou vous utilisez une fonction de membre, semblable à ceci:

class Salary 
{ 
private: 
    int sal[10]; 

public: 
    (...) 
    void display_des(); 
    (...) 
}; 
(...) 
void Salary::display_des(){ 
    sal[...]... 
    (...) 
} 
+1

Pensé aussi, mais qu'en est-il de ce mot-clé 'friend'? –

+0

Ami signifie qu'il peut accéder aux champs privés d'un objet-salaire donné. Mais vous ne le passez pas un objet-salaire. – Anedar

+0

Je sais ce qu'est un «ami». Pourtant, votre réponse est de s'attendre à ce que OP signifie des fonctions de membre, même si il/elle pourrait avoir signifié des fonctions d'ami. –