为什么在重载 C++ 时我不能访问私有成员

Why can I not access private members when overloading c++

以下是点和向量的一些class声明

#ifndef VECTOR_H
#define VECTOR_H
class Point {

    private:
        float x;
        float y;

    public:
        Point();
        Point(float x, float y);
        float get_x() const;
        float get_y() const;
        void set_x(float x);
        void set_y(float y);

};

class Vec : Point {
    
    public:
        Vec(float x, float y, float x1, float y1);
        Vec cross(Vec &v);
        Vec cross(float value);
        Vec dot(Vec& v);
        Vec mag();
        Vec normalize();
        Vec rotate(float w);
        Vec operator+(const Vec& v);
        Vec operator-(const Vec& v);
        Vec operator*(float s);
        Vec operator/(float s);
                    
};

#endif

我在这里实现了一个运算符重载函数(现在我只是调用将 x 值设置为另一个值)

Vec Vec::operator+(const Vec& v) {
    this->x = 0;
}

出于某种原因,我收到以下错误:

    error: ‘float Point::x’ is private within this context

尽管此函数在私有上下文中。 有人可以解释为什么我不能这样做吗?我还有其他函数是成员函数,它们没有这个问题。只有当我重载运算符时才会发生这种情况。

如果你想让衍生品能够访问基class的私有成员,你可以让它们protected

更新: 但是请注意,当 class 将 PointVec 进行子Point 时,您正在使用私有继承。如果你真的想使用 Point 的 public 函数作为接口,你应该使用 public 继承。否则只有 Vec class 能够使用 Point 函数。

#ifndef VECTOR_H
#define VECTOR_H
class Point {

    protected:
        float x;
        float y;

    public:
        Point();
        Point(float x, float y);
        float get_x() const;
        float get_y() const;
        void set_x(float x);
        void set_y(float y);

};

// Maybe you should use public inheritance here
class Vec : /*public*/ Point {
    
    public:
        Vec(float x, float y, float x1, float y1);
        Vec cross(Vec &v);
        Vec cross(float value);
        Vec dot(Vec& v);
        Vec mag();
        Vec normalize();
        Vec rotate(float w);
        Vec operator+(const Vec& v);
        Vec operator-(const Vec& v);
        Vec operator*(float s);
        Vec operator/(float s);
                    
};

#endif