2015-04-03 84 views
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;}; 

我在做什么错?

+1

它应该是'p.original_points'。朋友功能不是会员功能。 – 0x499602D2 2015-04-03 13:56:42

+0

@ 0x499602D2'p.original_points.push_back'不起作用。 'p'是一个'const'引用。 – juanchopanza 2015-04-03 14:06:38

+1

'vector '在哪里? – juanchopanza 2015-04-03 14:07:06

回答

1

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

目前还不清楚函数参数p应该是访问对象,对象是否传递到push_back或两者;或者这是否应该成为会员,而不是朋友。后者似乎更可能 - 您可能想要:

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

正如你所说的你想要添加点类型元素到保持字符串类型元素的向量,所以你也可能有类型不匹配错误。但对于未定义的,我有相同的错误,事实证明它是由字符串类型引起的,当你使用字符串时,应该提到你使用的是标准库中的字符串,所以我添加了“using namespace std;”并且错误消失了。 它也可以帮助你。

+1

请问?不要推荐'使用名称空间标准;',永远不要! – 2015-04-03 13:59:16

+0

我没有推荐,我说可能是什么原因。 – Mamuka 2015-04-03 14:01:45

+0

_“我说可能是什么原因。”_这不是原因。 – 2015-04-03 14:02:56

1

朋友确实可以访问类的非公共部分。但这不是问题—函数仍然是非成员(如果它是一个成员,它不一定是朋友)。该功能需要对象来访问该对象的非静态成员。你所得到的是基本相同的:

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

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

没有original_pointsadd_point指。

无论你想original_pointsstatic,或者你有一个Point对象传递到add_point访问其original_points成员,或访问它p

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

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,那就没问题。

总而言之,你的代码看起来很破碎。

+0

'object_inst.original_points.push_back(object_inst);'是我想要避免的。看起来,如果我把'vector'形式的类与'add_point()'函数一起排除,会更好。 – Ziezi 2015-04-03 14:12:29

+0

@simplicisveritatis如果'original_points'是一个类的数据成员,则需要通过该类的一个对象访问它,它不能独立存在。无论如何,矢量不能是类的一部分(见上面的第三点)。 – juanchopanza 2015-04-03 14:19:20

+0

了解,谢谢! – Ziezi 2015-04-03 14:25:51

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