Class 作用域和私有成员?
Class scope and private members?
我正在定义一个函数来向 vector<Point> original_points
添加元素,名为
void add_point()
。为什么在函数体中突出显示 original_points
为 undefined,当我使用 type 限定符时:friend(获得访问权限)并且它是 在 class?
的范围内
// 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;};
我做错了什么?
正如你所说的,你想将Point类型的元素添加到保留字符串类型元素的vector中,所以你也可能会出现类型不匹配的错误。但是对于undefined,我有同样的错误,结果证明它是由字符串类型引起的,当你使用字符串时你应该提到你正在使用标准库中的字符串,所以我添加了 "using namespace std;" 并且错误发生了.
它也可能对您有所帮助。
友元是非成员函数,不能直接访问非静态成员;它需要一个 Point
对象来操作。您还需要传递一些东西给 push_back
.
不清楚函数参数p
应该是要访问的对象,还是传递给push_back
的对象,或者两者都是;或者这是否真的应该是会员,而不是朋友。后者似乎更有可能——你可能想要:
void add_point(const Point& p){original_points.push_back(p);}
朋友可以访问 class 的非 public 部分。但这不是这里的问题——该函数仍然是非成员(如果它是成员,则不必是友元)。该函数需要一个 object 来访问该对象的非静态成员。你得到的和这个基本一样:
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
).
至少存在三个主要问题:
首先,std::vector::push_back()
有个参数。您需要将 Point
实例传递给它。您似乎想添加 p
:
original_points.push_back(p);
其次,友元函数是非成员函数,因此如果没有 class 的实例,则无法通过它访问 class 的成员.你没有这样的实例,所以你的朋友功能没有意义。这会编译,但不会有任何效果:
friend
inline void add_point(const Point& p){
Point x;
x.original_points.push_back(p);
}
也许您希望 add_point()
成为会员,在这种情况下它不应该是 friend
。这将解决第二个问题,but...
Third,假设original_points
是一个std::vector<Point>
,这样的容器不能用不完整的类型实例化。因此 Point
不能在不调用 未定义行为 的情况下拥有数据成员 std::vector<Point>
。另一方面,如果它是一个 boost::container::<Point>
,或另一个支持不完整类型的 vector
,那就没问题了。
总而言之,您的代码似乎很糟糕。
将 vector<Point>
和 add_point(const Point& p)
放在 class 中的想法是为了确保某些局部性。把 then 放在 common 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
我正在定义一个函数来向 vector<Point> original_points
添加元素,名为
void add_point()
。为什么在函数体中突出显示 original_points
为 undefined,当我使用 type 限定符时:friend(获得访问权限)并且它是 在 class?
// 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;};
我做错了什么?
正如你所说的,你想将Point类型的元素添加到保留字符串类型元素的vector中,所以你也可能会出现类型不匹配的错误。但是对于undefined,我有同样的错误,结果证明它是由字符串类型引起的,当你使用字符串时你应该提到你正在使用标准库中的字符串,所以我添加了 "using namespace std;" 并且错误发生了. 它也可能对您有所帮助。
友元是非成员函数,不能直接访问非静态成员;它需要一个 Point
对象来操作。您还需要传递一些东西给 push_back
.
不清楚函数参数p
应该是要访问的对象,还是传递给push_back
的对象,或者两者都是;或者这是否真的应该是会员,而不是朋友。后者似乎更有可能——你可能想要:
void add_point(const Point& p){original_points.push_back(p);}
朋友可以访问 class 的非 public 部分。但这不是这里的问题——该函数仍然是非成员(如果它是成员,则不必是友元)。该函数需要一个 object 来访问该对象的非静态成员。你得到的和这个基本一样:
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
).
至少存在三个主要问题:
首先,std::vector::push_back()
有个参数。您需要将 Point
实例传递给它。您似乎想添加 p
:
original_points.push_back(p);
其次,友元函数是非成员函数,因此如果没有 class 的实例,则无法通过它访问 class 的成员.你没有这样的实例,所以你的朋友功能没有意义。这会编译,但不会有任何效果:
friend
inline void add_point(const Point& p){
Point x;
x.original_points.push_back(p);
}
也许您希望 add_point()
成为会员,在这种情况下它不应该是 friend
。这将解决第二个问题,but...
Third,假设original_points
是一个std::vector<Point>
,这样的容器不能用不完整的类型实例化。因此 Point
不能在不调用 未定义行为 的情况下拥有数据成员 std::vector<Point>
。另一方面,如果它是一个 boost::container::<Point>
,或另一个支持不完整类型的 vector
,那就没问题了。
总而言之,您的代码似乎很糟糕。
将 vector<Point>
和 add_point(const Point& p)
放在 class 中的想法是为了确保某些局部性。把 then 放在 common 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