如果我有两个班级,一个是Point
,第二个是Square
,则Point
具有成员数据:x
和y
都是“私有的” “代表点的坐标。
类Square
和类似的类实现“具有”关系;例如Square
有四个点。由于某些原因,Point
通过“友谊”授予访问其私有数据的权限;但仅限于包含类的名为print
的成员函数。
问题:
类Point
需要查看类似Square
的类的定义,以便将其打印成员声明为朋友。
Square
需要查看类Point
的定义,以便可以将其实例声明为其成员。
使用前向声明不能解决问题,因为它仍然是“不完整类型”。那么如何解决呢?
class Square;
class Point{
public:
using pos = int;
Point() = default;
Point(pos, pos);
pos getX()const{ return x_; }
pos getY()const{ return y_; }
void setX(pos x){ x_ = x; }
void setY(pos y){ y_ = y; }
private:
pos x_{};
pos y_{};
// friend void Square::print()const; // the problem here. Square is still incomplete type
// friend class Square; // we don't want this solution
};
inline Point::Point(pos x, pos y) :
x_{ x },
y_{ y }{
}
class Square{
public:
Square(const Point&, const Point&, const Point&, const Point&);
Point getPtA()const{ return ptA_; }
Point getPtB()const{ return ptB_; }
Point getPtC()const{ return ptC_; }
Point getPtD()const{ return ptD_; }
void setPtA(const Point& ptA){ ptA_ = ptA; }
void setPtB(const Point& ptB){ ptB_ = ptB; }
void setPtC(const Point& ptC){ ptC_ = ptC; }
void setPtD(const Point& ptD){ ptD_ = ptD; }
void print()const;
private:
Point ptA_, ptB_, ptC_, ptD_;
};
Square::Square(const Point& ptA, const Point& ptB, const Point& ptC, const Point& ptD) :
ptA_{ ptA }, ptB_{ ptB },
ptC_{ ptC }, ptD_{ ptD }{
}
void Square::print()const{
using pos = Point::pos;
for(pos i{ptA_.x_}; i != ptB_.x_; ++i){
for(pos j{ptA_.y_}; j != ptC_.y_; ++j)
std::cout << "*";
std::cout << std::endl;
}
}