问题描述
当我在类 circle 中将 Point p 声明为私有时,我收到一个编译器错误,指出数据成员 Point p 在上下文中是私有的。代码和编译器错误如下。
#include<iostream>
#include<vector>
class Point
{
public:
Point(double a,double b)
{
x = a;
y = b;
}
virtual ~Point(){}
private:
double x;
double y;
};
类形状和圆形的代码如下:
class shapes {
public:
virtual Point centre() const = 0;
virtual void draw() const = 0;
virtual void rotate(int angle) const = 0;
virtual ~shapes(){}
};
class circle: public shapes {
public:
Point centre() const override { return p; }
void draw() const override { }
void rotate(int angle) const override {}
virtual ~circle() {}
circle(Point x,int r):p{x},radius{r}{}
private:
Point p;
int radius; };
编辑:笑脸类继承自圆类,代码如下:
class smiley: public circle
{ //smiley face is a circle + eyes and mouth
public:
smiley(Point p,int r):circle{p,r},mouth{nullptr}{}
Point centre() const override { return p;}
void draw() const override
{
//draw circle
circle::draw();
for(auto e:eyes)
{
e->draw();
}
mouth->draw();
}
void rotate(int angle) const {}
virtual ~smiley()
{
delete mouth;
for (auto eye : eyes) //why not delete [] eyes
{
delete eye;
}
}
private:
std::vector<shapes*> eyes; //smiley face has eyes
shapes* mouth; //smiley face has a mouth
};
如果我在类圈中公开数据成员 p,则一切正常。下面列出了编译器错误:
为什么不能在圆类private中定义Point对象p?
编辑:我添加了编译器错误消息并添加了下面评论中要求的缺失代码。你能重新打开这个问题吗?
解决方法
私有类成员只能在类内或由朋友访问,因此,如果您希望非朋友在类外访问它,则需要使用 setter/getter。