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

#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

有帮助吗?

解决方案

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

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;
};

错误,否,位置在函数“main”

中不可见

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

中放置公共getter函数

你的朋友声明需要

friend int main();

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

嗯,你已经得到了错误的答案。但有一件事: 您是否计划让多维数据集访问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. 使用朋友关键字
  4. 您清楚地说您需要从其他地方访问CPosition类。嗯,这是上课。问题1解决了。

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

    1. 通过 CCube :: Position public
    2. 通过添加访问器方法 - CCube :: MoveTo(const CPosition&amp; p) CCube :: GetPosition()const
    3. 正如@Firas所说:在你确定需要它之前,不要与朋友一起玩。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top