c++ class friend

c++ class friend

本文关键字:friend class c++      更新时间:2023-10-16

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

#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次。我希望类CPosition在CCube之外声明,这样我将来就可以在新的类中使用它,例如CBall:),但我如何在不使用继承的情况下使它工作呢。有可能吗:)?

谨致问候,PK

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

class CCube
{
    private:
        CPosition Position;
    public:
        CPosition&       getPosition()       { return Position; }
        CPosition const& getPosition() const { return Position; }
};
语句friend class CPosition;表示CPosition现在可以访问CCube类的私有成员。对于其他所有类,成员仍然像您声明的那样是私有的。要使样品发挥作用,您需要:
class CCube
{
     public:
         CPosition Position;
};

errr,否,位置在函数"main"中不可见

公开。。。或者在中放入一个公共getter函数

您的好友声明需要是

friend int main();

您正在授予访问CCube私人会员的"main"权限。

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

我想说的是,你需要确保你需要利用朋友。这是一个很好的起点。

好的,可以使用:

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

感谢

您有三个问题:

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

你清楚地说你需要CPosition类可以从其他地方访问。好吧,这是课堂。问题1已解决。

如果你想让CCube的用户能够改变CCube的位置,你需要提供一种方法:

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

正如@Firas所说:除非你真的确定自己需要friend,否则不要玩它。