访问全局范围内的私有变量

时间:2010-06-21 13:11:10

标签: c++ scope global-scope

在下面的代码中,全局范围内的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 个答案:

答案 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过载适当的比较运算符。