3

在下面的代码中,全局范围内的 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();
}
4

4 回答 4

9

查看朋友关键字。

于 2010-06-21T13:12:39.663 回答
3

首先,这不是先验的脏东西。注释行的位置已经表明该类Box控制允许谁触摸其私有(双关语)。

其次,由于这是一项学校作业,我认为应该在课堂上提到解决方案:这可以通过friend声明来实现。

于 2010-06-21T13:13:31.973 回答
1

声明foofriend 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();
   }
于 2010-06-21T13:16:31.327 回答
0

除了涉及朋友的其他答案之外,从长远来看,更好的答案(尽管不是单行更改)是让 Box 重载适当的比较运算符。

于 2010-06-21T13:29:52.523 回答