班级范围和私人会员?

时间:2015-04-03 13:51:28

标签: c++ class scope non-member-functions

我正在定义一个向vector<Point> original_points添加元素的函数,名为
void add_point()。当我使用 type qualifier:friend (获取访问权限)时,为什么在函数体中突出显示 original_points undefined 它是在类的范围内?

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

我做错了什么?

5 个答案:

答案 0 :(得分: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无法在不调用未定义行为的情况下拥有数据成员std::vector<Point>。另一方面,如果支持不完整类型的是boost::container::<Point>或其他vector,那就没问题了。

总而言之,你的代码似乎很破碎。

答案 1 :(得分:1)

朋友是非会员功能,因此无法直接访问非静态会员;它需要一个Point对象来行动。您还需要将某些内容传递给push_back

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

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

答案 2 :(得分:1)

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

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

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

original_points没有add_point可以引用。

您希望original_pointsstatic,或者您必须将Point个对象传递到add_point才能访问其original_points成员,或者在p上访问它。

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

答案 3 :(得分:0)

正如您所说,您希望将Point类型元素添加到保留字符串类型元素的向量中,因此您也可能出现类型不匹配错误。但是对于undefined,我遇到了同样的错误,结果发现它是由字符串类型引起的,当你使用字符串时,你应该提到你正在使用标准库中的字符串,所以我添加了#34; using namespace std;& #34;并且错误发生了。 它也可能对你有帮助。

答案 4 :(得分:0)

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