为什么这个朋友的功能不能访问私有变量?

时间:2013-06-18 15:06:03

标签: c++ class friend

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,我们可以在课堂上的任何地方为朋友制作原型。

5 个答案:

答案 0 :(得分:5)

那是因为allow属于该类的实例,但没有引用实例。

您应该使printResult成为该类的成员函数,而不是使其成为外部函数使该函数引用Student实例,以便您可以通过allow访问instance.allow成员,其中instanceconst 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;
  }
}