c ++类朋友

时间:2008-10-29 10:17:49

标签: c++ class inheritance friend

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

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

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

此致 PK

7 个答案:

答案 0 :(得分:5)

除了普通的吸气剂,你还应该有一个常数吸气剂 请注意以参考方式返回。这允许您对SetXX()的任何调用都会影响CCube内部的位置副本,而不会影响您一直在更新的副本。

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

答案 1 :(得分:4)

声明friend class CPosition;表示CPosition现在可以访问CCube类的私有成员。对于每个其他类,成员仍然像您声明的那样私有。为了使样本有效:

class CCube
{
     public:
         CPosition Position;
};

答案 2 :(得分:1)

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

将其公开......或者在

中放置公共getter函数

答案 3 :(得分:1)

你的朋友声明需要

friend int main();

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

答案 4 :(得分:0)

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

我所说的是你需要确保你需要使用朋友。这是一个good place to start

答案 5 :(得分:0)

确定适用于:

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

main()
{
  CCube cube1;

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

由于

答案 6 :(得分:0)

你有三个问题:

  1. CPosition
  2. 的可重用性
  3. 如何影响形状的状态(在这种情况下包括CPosition类型的成员,但也可能包含int radius或其他内容)
  4. 使用friend关键字
  5. 您清楚地说您需要从其他地方访问CPosition类。嗯,这是上课。问题1解决了。

    如果您希望CCube个用户能够更改CCube的位置,则需要提供相应的方法:

    1. CCube::Position公开
    2. 添加访问者方法 - CCube::MoveTo( const CPosition& p )CCube::GetPosition() const
    3. 正如@Firas所说:在你确定需要它之前不要与friend一起玩。