C++ 中的私有 class 属性

Private class attributes in C++

我目前正在复习学校的一门课程,我 运行 反对这个问题。

以下代码的问题是我的 Box class 的属性 xy 是私有的,因此 Foo 方法。课程仍然不如告诉我 为什么 所以我决定问问 Whosebug 的好人。

下面//Insert line of code here上应该添加什么代码才能使我现在的程序运行?

#include <iostream>

using namespace std;

class Box {
    int x,y;

    public:
    Box(int xi, int yi) 
    {
        x=xi;
        y=yi;
    }

    //Insert line of code here
}

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();
}

你想做什么?您希望 x 和 y 可以修改吗?如果不是,请添加 getX 和 getY 方法,它们只是 return class 中的值。如果您希望它们可以自由修改,请放弃面向对象的游戏,直接制作它们 public,因为在这种情况下没有理由试图保护它们。

用一些get方法来做:

#include <iostream>

using namespace std;

class Box {
    int x,y;

    public:
    Box(int xi, int yi) 
    {
        x=xi;
        y=yi;
    }

    //Insert line of code here
    int Box::getx(){return x;}
    int Box::gety(){return y;}
}

bool foo(Box l, Box r){
    return (l.get()*l.gety())>(r.getx()*r.gety());
}

int main(int argc, char* argv[])
{
   Box b1(3,4), b2(1,2);

   if(foo(b1,b2)) {
       cout <<"b1>b2\n";
   }
   return cin.get();
}

这里有很多选项。如果只允许添加一行,可以将 foo 设为友元函数:

friend bool foo(Box l, Box r);

Getter 可能是更好的选择,您也可以将 foo 设为静态函数,但这需要三行(在 foo 前面添加 Box::定义和主要调用它的地方)。