2013-06-18 3 views
4
class Student{ 
public: 
Student(int test) 
:key(705) 
{ 
    if(test == key) 
    {cout << "A student is being verified with a correct key: "<< test << endl; 
    allow=1; 
    } 
    else 
    { 
     cout << "Wrong key" ; 
    } 
} 

friend void printResult(); 


private: 
const int key; 
int allow; 


}; 

void printResult() 
{ 
if(allow==1) 
{ 
    cout<< " Maths: 75 \n Science:80 \n English: 75" << endl; 
    } 
} 

int main() 
{ 
int testkey; 
cout << "Enter key for Bob: "; 
cin >> testkey; 

Student bob(testkey); 

printResult(); 

} 

Функция printResult не может получить доступ к переменной allow, которая является частной, из класса Student. Я использовал прототип printResult в неправильном месте или был синтаксис неправильным? AFAIK, мы можем прототипировать друзей в любом месте класса.Почему этот знакомый не может получить доступ к закрытым переменным?

+0

Какая именно ошибка вы получаете? – ereOn

ответ

2

Вот код, который работает:

#include <iostream> 
class Student 
{ 
public: 
Student(int test) : key(705) 
{ 
    if(test == key) 
    { 
     std::cout << "A student is being verified with a correct key: "<< test << std::endl; 
     allow=1; 
    } 
    else 
    { 
     std::cout << "Wrong key" ; 
    } 
} 

friend void printResult(Student* student); 

private: 
    const int key; 
    int allow; 
}; 

void printResult(Student* student) 
{ 
    if(student->allow==1) 
    { 
     std::cout<< " Maths: 75 \n Science:80 \n English: 75" << std::endl; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    int testkey; 
    std::cout << "Enter key for Bob: "; 
    std::cin >> testkey; 

    Student bob(testkey); 

    printResult(&bob); 
} 

Я изменил его, чтобы сохранить функцию печати в глобальном пространстве (только основанный на том, как он выглядел так, как вы хотели). Он принимает аргумент Student *, и поскольку он объявлен как друг, он увидит переменную «allow». Это, однако, не является частью C++, которую вы хотите злоупотреблять. Будьте осторожны с тем, как вы используете друга. Использование этого, как это, опасно в большей базе кода. Глобальная функциональность обычно не подходит. Наличие функции печати в качестве функции открытого члена в классе ученика, вероятно, будет лучшим способом сделать что-то. Другие ответы предоставили код, который показывает эту реализацию. Я решил показать вам эту реализацию, поскольку она казалась более близкой к тому, что вы искали в своем вопросе.

Я также обязательно использую 'std ::', когда ссылаюсь на cout и endl. Это устраняет необходимость использования 'namespace std;' на вершине. Это просто хорошая практика программирования в будущем по более сложным проектам.

+1

Спасибо за дополнительную подсказку! Мне потребуется время, чтобы изучить сделанные вами изменения ... очень полезный ответ! – user2477112

+1

Еще одна вещь, которую вы, возможно, захотите рассмотреть, - это делать ввод другим способом. Голый cin >> может выйти из строя, если вы дадите ему неожиданные данные, отбросив остальную часть вашей программы. –

5

Это потому, что allow относится к экземпляру класса, но экземпляр не упоминается.

Вы, вероятно, следует сделать printResult функцию-член класса вместо того, чтобы сделать его внешнюю функцию или сделать функцию взять ссылку на Student, например, таким образом Вы можете получить доступ к allow члена через instance.allow где instance является параметром типа const Student&.

5

printResult не является членом, поэтому вам необходимо предоставить ему экземпляр Student. Например

void printResult(const Student& s) 
{ 
if(s.allow==1) 
{ 
    cout<< " Maths: 75 \n Science:80 \n English: 75" << endl; 
    } 
} 

затем

Student student(1); 
printResult(student); 
2

друг класса функции могут получить доступ к членам экземпляра класса. Вы должны передать экземпляр функции, как:

void printResult(Student s) 
{ 
if(s.allow==1) 
{ 
    cout<< " Maths: 75 \n Science:80 \n English: 75" << endl; 
    } 
} 
+0

Это передает копию, которая не нужна. Вместо этого заставьте функцию «const Student &». (Вам не нужно ничего менять, кроме списка аргументов) –

2
class Student{  
private: 
const int key; 
int allow;  
public: 
Student(int test) 
:key(705) 
{ 
    if(test == key) 
    {cout << "A student is being verified with a correct key: "<< test << endl; 
    int allow=1; 
    } 
    else 
    { 
     cout << "Wrong key" ; 
    } 
}  
friend void printResult(); 
void printResult() //<--- printResult() is a member function, so keep it inside the class 
{ 
if(allow==1) 
{ 
    cout<< " Maths: 75 \n Science:80 \n English: 75" << endl; 
    } 
} 
}; 

int main() 
{ 
int testkey; 
cout << "Enter key for Bob: "; 
cin >> testkey;  
Student bob(testkey); 
bob.printResult(); // <--- you need to specify the owner of printResult() 
}