如何为包含该类的非引用/指针的类定义一个朋友成员函数?

时间:2019-05-11 15:51:21

标签: c++ friend

如果我有两个班级,一个是Point,第二个是Square,则Point具有成员数据:xy都是“私有的” “代表点的坐标。

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

0 个答案:

没有答案