【问题标题】:c++ class friendc++类朋友
【发布时间】:2010-09-19 18:23:34
【问题描述】:

我正在尝试编译这样的代码:

#include <iostream>
using namespace std;

class CPosition
{
  private:
    int itsX,itsY;
  public:
    void Show();
    void Set(int,int);
};

void CPosition::Set(int a, int b)
{
  itsX=a;
  itsY=b;
}

void CPosition::Show()
{
    cout << "x:" << itsX << " y:" << itsY << endl;
}

class CCube
{
  friend class CPosition;
  private:
         CPosition Position;
};

main()
{
  CCube cube1;

  cube1.Position.Show();
  cube1.Position.Set(2,3);
  cube1.Position.Show();
}

但是 get 'CCube::Position' 在函数 main() 中不可访问 3 次。 我希望在 CCube 外部声明 CPosition 类,以便将来可以在新类中使用它,例如CBall :) 但是如何在不使用继承的情况下使其工作。有可能吗:)?

问候, PK

【问题讨论】:

    标签: c++ class inheritance friend


    【解决方案1】:

    除了普通的 getter,你还应该有一个 const getter。
    请注意参考退货。这允许您对 SetXX() 的任何调用来影响 CCube 内的 Position 副本,而不是您一直在更新的副本。

    class CCube
    {
        private:
            CPosition Position;
        public:
            CPosition&       getPosition()       { return Position; }
            CPosition const& getPosition() const { return Position; }
    };
    

    【讨论】:

      【解决方案2】:

      声明friend class CPosition; 表示CPosition 现在可以访问CCube 类的私有成员。对于其他每个班级,成员仍然像您声明的那样是私有的。要使示例工作,您需要:

      class CCube
      {
           public:
               CPosition Position;
      };
      

      【讨论】:

        【解决方案3】:

        你有 3 个问题合二为一:

        1. CPosition 的可重用性
        2. 如何影响形状的状态(在这种情况下包括 CPosition 类型的成员,但也可能包括 int radius 或其他)
        3. friend 关键字的使用

        您明确表示您需要 CPosition 类才能从其他地方访问。嗯,就是上课。问题1解决了。

        如果您希望CCube 用户能够更改CCube 的位置,您需要为此提供一种方法:

        1. 公开CCube::Position
        2. 通过添加访问器方法 - CCube::MoveTo( const CPosition&amp; p )CCube::GetPosition() const

        正如@Firas 所说:在你确定自己需要它之前,不要玩friend

        【讨论】:

          【解决方案4】:

          好的,它适用于:

          class CCube
          {
            private:
                   CPosition Position;
            public:
            CPosition& getPosition() { return Position; }
          };
          
          main()
          {
            CCube cube1;
          
            cube1.getPosition().Show();
            cube1.getPosition().Set(2,3);
            cube1.getPosition().Show();
          }
          

          谢谢

          【讨论】:

          • 这当然有效,但这并不意味着它是最好的主意。例如,可能会更好。在 CCube 中添加一个调用 Position.Set(x, y) 的 SetPosition(x, y) 本身,这样您就可以更好地隐藏 CCube 的内部。本质上为您希望访问的位置部分添加公共功能。
          【解决方案5】:

          嗯,你已经得到了错误的答案。不过有一件事: 您是否计划让多维数据集访问 CPosition 的私有成员(itsX、itsY)?如果不是,则不需要将其声明为朋友。如果是,请考虑在 CPosition 中公开公共方法以返回 X 和 Y,您仍然不需要将其声明为友元。

          我的意思是你需要确保你需要使用朋友。这是good place to start

          【讨论】:

            【解决方案6】:

            你的朋友声明需要是

            friend int main();
            

            您正在授予访问 CCube 私有成员的“主要”权限。

            【讨论】:

              【解决方案7】:

              错误,不,位置在函数“main”中不可见

              将其公开...或将公开的 getter 函数放入

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-08-10
                • 1970-01-01
                • 1970-01-01
                • 2015-10-21
                • 2012-01-21
                相关资源
                最近更新 更多