我正在尝试编译这样的代码:
#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
答案 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)
你有三个问题:
CPosition
CPosition
类型的成员,但也可能包含int radius
或其他内容)friend
关键字您清楚地说您需要从其他地方访问CPosition类。嗯,这是上课。问题1解决了。
如果您希望CCube
个用户能够更改CCube
的位置,则需要提供相应的方法:
CCube::Position
公开CCube::MoveTo( const CPosition& p )
和CCube::GetPosition() const
。正如@Firas所说:在你确定需要它之前不要与friend
一起玩。