在下面的代码中,全局范围内的foo函数尝试访问Box的私有变量,这些变量当然不起作用。我必须让foo函数在学校作业的地方显示代码中使用一行代码。
#include <iostream>
using namespace std;
class Box {
int x,y;
public:
Box(int xi,int yi) {x=xi;y=yi;}
// One line of code to make foo(Box, Box) work
};
bool foo(Box l,Box r) {return (l.x*l.y)>(r.x*r.y);}
int main(int argc, char* argv[]) {
Box b1(3,4),b2(1,2);
if (foo(b1,b2)) cout << "b1>b2\n";
return cin.get();
}
答案 0 :(得分:9)
查看friend关键字。
答案 1 :(得分:3)
首先,这是不先验的脏东西。注释行的位置已经表明类Box
控制允许谁触及其私有(双关语)。
其次,由于这是一项学校作业,我认为应该在课堂上提到解决方案:这可以使用friend
声明来实现。
答案 2 :(得分:1)
在foo
friend function
声明为Box
#include<iostream>
class Box {
int x,y;
public:
Box(int xi,int yi) :x(xi),y(yi){}// Always use initializer list for initializing data members, i.e. prefer initialization over assignment
friend bool foo(Box,Box);// friend functions can access private members
};
bool foo(Box l,Box r) // friend keyword not to be written while defining the function
{return (l.x*l.y)>(r.x*r.y);}
int main(int argc, char* argv[]) {
Box b1(3,4),b2(1,2);
if (foo(b1,b2)) std::cout << "b1>b2\n";
return std::cin.get();
}
答案 3 :(得分:0)
除了涉及朋友的其他答案之外,长期更好的答案(尽管不是单行更改)将使Box过载适当的比较运算符。