Доступ к закрытой переменной в глобальной области видимости - PullRequest
3 голосов
/ 21 июня 2010

В этом коде ниже функция 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 ]

9 голосов
/ 21 июня 2010

Просмотрите ключевое слово friend .

3 голосов
/ 21 июня 2010

Во-первых, это , а не априори грязная вещь.Размещение строки комментария уже указывает на то, что класс Box контролирует, кому разрешено касаться его рядовых (каламбур предназначен).

Во-вторых, поскольку это школьное задание, я думаю, что решение должно быть упомянутов классе: это может быть достигнуто с помощью объявления friend.

1 голос
/ 21 июня 2010

Объявите 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();
   }
0 голосов
/ 21 июня 2010

В дополнение к другим ответам, связанным с друзьями, лучше в долгосрочной перспективе (хотя и не в одной строке) ответить на вопрос о перегрузке Box соответствующих операторов сравнения.

...