3

以下のコードでは、グローバルスコープのfoo関数がBoxのプライベート変数にアクセスしようとしますが、これはもちろん機能しません。学校の課題のコードを表示する場所で、foo関数を1行のコードで機能させる必要があります。

#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

内部fooとして宣言するfriend functionBox

   #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

友人が関与する他の回答に加えて、長期的には(1行の変更ではありませんが)、Boxが適切な比較演算子をオーバーロードすることをお勧めします。

于 2010-06-21T13:29:52.523 に答える