为什么在重载 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 将 Point
与 Vec
进行子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
以下是点和向量的一些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 将 Point
与 Vec
进行子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