【问题标题】:Access private variable in global scope在全局范围内访问私有变量
【发布时间】:2010-06-21 13:11:09
【问题描述】:

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

【问题讨论】:

    标签: c++ scope global-scope


    【解决方案1】:

    查看friend 关键字。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        Box 内声明foofriend function

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

        【讨论】:

        • 对于标记为作业的问题,我认为最好在没有确切代码的情况下提供所需的指导。这样他们就可以查看您告诉他们的内容并从中学习,而不是复制/粘贴。
        • @Brian:是的,我同意,但我认为这不是你投反对票的正当理由。
        • 你在做一个假设,我没有投反对票。检查我的反对票帐号。我很少投反对票。我喜欢离开 cmets。可能是对我发表评论的人之一。
        • @Brian:没有难过的感觉。我只是以为只有你对我的帖子发表了评论,所以反对票很可能是你的。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-08-23
          • 1970-01-01
          • 2013-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          • 1970-01-01
          相关资源
          最近更新 更多