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似乎无法从Student类访问变量allow(私有)。我是否在错误的地方将printResult原型化或语法错误? AFAIK,我们可以在课堂上的任何地方为朋友制作原型。
答案 0 :(得分:5)
那是因为allow
属于该类的实例,但没有引用实例。
您应该使printResult
成为该类的成员函数,而不是使其成为外部函数或使该函数引用Student
实例,以便您可以通过allow
访问instance.allow
成员,其中instance
是const Student&
类型的参数。
答案 1 :(得分: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 :(得分: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()
}
答案 3 :(得分: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 ++的一部分。小心你如何使用朋友。像这样使用它在更大的代码库中是危险的。全局功能通常不是可行的方法。将打印功能作为学生班级中的公共成员功能可能是更好的做事方式。其他答案提供了显示实现的代码。我决定向您展示这个实现,因为它似乎更接近您在问题中寻找的内容。
在引用cout和endl时,我也确保使用'std ::'。这消除了使用'using namespace std;'的需要。在顶部。在更复杂的项目中,这只是一个很好的编程实践。
答案 4 :(得分:1)
允许类友元函数访问类实例的成员。 您应该将实例传递给函数,例如:
void printResult(Student s)
{
if(s.allow==1)
{
cout<< " Maths: 75 \n Science:80 \n English: 75" << endl;
}
}