繁体   English   中英

班级范围和私人成员?

[英]Class scope and private members?

我正在定义一个函数将元素添加到vector<Point> original_points ,名为
void add_point() 当我使用类型限定符:friend (以获取访问权限)并且在类范围内时,为什么在函数体中高亮显示original_pointsundefined

// data structure representing Point in 2D plane
class Point{
public:
  //contructors
  Point();
  Point(double x, double y);
  // non-modifying methods
  inline double get_xcoord()const{return xcoord;}
  inline double get_ycoord()const{return ycoord;}
  // modifying methods
  inline double set_xcoord(double x){xcoord=x;}
  inline double set_ycoord(double y){ycoord=y;}
  // non-member function with access to private members
  friend inline void add_point(const Point& p){original_points.push_back();}
private:
  double xcoord;
  double ycoord;
  vector<Point> original_points;};

我究竟做错了什么?

至少存在三个主要问题:

首先std::vector::push_back()有一个参数。 您需要将Point实例传递给它。 看来您想添加p

original_points.push_back(p);

其次 ,朋友函数是非成员函数,因此如果没有该类的实例,则无法通过该函数访问该类的成员。 您没有这样的实例,因此您的friend函数毫无意义。 这样可以编译,但是没有效果:

friend 
inline void add_point(const Point& p){
  Point x;
  x.original_points.push_back(p);
}

也许您希望add_point()成为成员,在这种情况下,它不应该成为friend 那可以解决第二个问题, 但是 ...

第三 ,假设original_pointsstd::vector<Point> ,则不能使用不完整的类型实例化此类容器。 因此,在不调用未定义行为的情况下, Point不能具有数据成员std::vector<Point> 另一方面,如果它是boost::container::<Point> ,或者另一个支持不完整类型的vector ,那就没问题了。

总而言之,您的代码似乎很混乱。

朋友是一个非成员函数,因此它不能直接访问非静态成员。 它需要一个Point对象来作用。 您还需要传递一些东西给push_back

尚不清楚函数参数p应该是要访问的对象,还是要传递给push_back的对象,还是两者都应; 或实际上是否应该是会员,而不是朋友。 后者似乎更有可能-您可能想要:

void add_point(const Point& p){original_points.push_back(p);}

朋友可以访问课程的非公开部分。 但这不是这里的问题-函数仍然是非成员的(如果它是成员,则不必是朋友)。 该函数需要一个对象来访问该对象的非静态成员。 您所拥有的基本上与此相同:

class Point
{
public:
  vector<Point> original_points;
};

void add_point(const Point &p) { original_points.push_back(p); }

没有add_point要引用的original_points

您要么希望original_pointsstatic ,要么必须将Point对象传递到add_point以访问其original_points成员,或者在p对其进行访问。

作为一个侧面说明, push_back()有一个参数,我们必须指定要添加到载体(但我认为应该是p )。

就像您说的那样,您想将Point类型元素添加到保留字符串类型元素的向量中,因此您可能还会遇到类型不匹配错误。 但是对于未定义,我遇到了同样的错误,结果是由字符串类型引起的,当您使用字符串时,应该提到您使用的是标准库中的字符串,因此我添加了“ using namespace std;”。 错误消失了。 它也可以帮助您。

vector<Point>add_point(const Point& p)放在类中的想法是确保某些局部性。 然后将其置于通用namespace应该是一个更好的解决方案(?)

namespace MyPoint{
// data structure representing Point in 2D plane
class Point{
public:
//contructors
Point();
Point(double x, double y);
// non-modifying methods
inline double get_xcoord()const{return xcoord;}
inline double get_ycoord()const{return ycoord;}
// modifying methods
inline double set_xcoord(double x){xcoord=x;}
inline double set_ycoord(double y){ycoord=y;}


private:
double xcoord;
double ycoord;};
vector<Point> original_points;
void add_point(const Point& p){original_points.push_back(p);} //end of namespace

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM