3

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

#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

4

7 回答 7

5

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

class CCube
{
    private:
        CPosition Position;
    public:
        CPosition&       getPosition()       { return Position; }
        CPosition const& getPosition() const { return Position; }
};
于 2008-10-29T12:32:49.680 回答
4

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

class CCube
{
     public:
         CPosition Position;
};
于 2008-10-29T10:20:45.250 回答
1

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

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

于 2008-10-29T10:20:09.543 回答
1

你的朋友声明需要是

friend int main();

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

于 2008-10-29T10:25:55.427 回答
0

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

我的意思是你需要确保你需要使用朋友。这是一个很好的起点

于 2008-10-29T10:25:53.680 回答
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();
}

谢谢

于 2008-10-29T10:52:09.243 回答
0

你有3个问题:

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

您清楚地说您需要 CPosition 类才能从其他地方访问。嗯,就是上课。问题1解决了。

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

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

friend正如@Firas 所说:在你确定你需要它之​​前不要玩。

于 2008-10-29T11:09:31.750 回答