0

我正在定义一个函数来将元素添加到vector<Point> original_points名为
void add_point(). 为什么在函数体中突出显示original_points未定义,当我使用类型限定符时:朋友(获得访问权限)并且它在类的范围内

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

我究竟做错了什么?

4

5 回答 5

3

至少存在三个主要问题:

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

original_points.push_back(p);

其次,友元函数是非成员函数,因此如果没有该类的实例,则无法通过它访问该类的成员。你没有这样的实例,所以你的朋友功能没有意义。这将编译,但没有效果:

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

也许您想add_point()成为会员,在这种情况下,它不应该是friend. 这将解决第二个问题,但是......

第三,假设original_pointsstd::vector<Point>,这样的容器不能用不完整的类型实例化。因此,如果不调用未定义的行为Point,就不能拥有数据成员。另一方面,如果它是 a或 another支持不完整类型,那很好。std::vector<Point>boost::container::<Point>vector

总而言之,您的代码似乎很糟糕。

于 2015-04-03T14:00:32.833 回答
1

好友是非成员函数,所以不能直接访问非静态成员;它需要一个Point对象来执行。您还需要将一些东西传递给push_back.

不清楚函数参数p应该是要访问的对象、要传递给的对象push_back,还是两者兼而有之;或者这是否应该是会员,而不是朋友。后者似乎更有可能 - 你可能想要:

void add_point(const Point& p){original_points.push_back(p);}
于 2015-04-03T13:58:51.843 回答
1

朋友确实可以访问课程的非公开部分。但这不是这里的问题——该函数仍然是非成员(如果它是成员,则不必是朋友)。该函数需要一个对象来访问该对象的非静态成员。你得到的基本上和这个一样:

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

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

没有original_points可供add_point参考的。

要么你想original_points成为static,要么你必须传递一个Point对象add_point来访问它的original_points成员,或者在p.

作为旁注,push_back()需要一个参数——您必须指定添加到向量中的内容(但我认为应该是p)。

于 2015-04-03T13:59:11.447 回答
0

正如您所说,您想将 Point 类型元素添加到保留字符串类型元素的向量中,因此您也可能遇到类型不匹配错误。但是对于未定义,我有同样的错误,原来是字符串类型引起的,当你使用字符串时,你应该提到你使用的是标准库中的字符串,所以我添加了“使用命名空间std;” 错误消失了。它也可以帮助你。

于 2015-04-03T13:57:35.803 回答
0

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

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
于 2015-04-03T15:04:12.030 回答