类范围和私有成员
Class scope and private members?
我正在定义一个函数,将元素添加到vector<Point> original_points
,名为void add_point()
。为什么在函数体中将original_points
突出显示为未定义,而我正在使用类型限定符:friend(以获得访问权限),并且它在类的范围内
// 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_points
是std::vector<Point>
,则不能用不完整的类型实例化此类容器。因此,如果不调用未定义的行为,Point
就不能有数据成员std::vector<Point>
。另一方面,如果它是一个boost::container::<Point>
或另一个支持不完整类型的vector
,那也没关系。
总而言之,你的代码似乎很坏。
friend是非成员函数,因此不能直接访问非静态成员;它需要一个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_points
是static
,要么您必须将Point
对象传递到add_point
以访问其original_points
成员,或者在p
上访问它。
附带说明一下,push_back()
有一个论点—您必须指定要添加到向量的内容(但我认为应该是p
)。
正如您所说,您希望将Point类型元素添加到保持字符串类型元素的向量中,因此您可能也会出现类型不匹配错误。但对于undefined,我也遇到了同样的错误,结果发现它是由字符串类型引起的,当你使用字符串时,你应该提到你使用的是标准库中的字符串,所以我添加了"使用命名空间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
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 检查私有成员变量是否在一定范围内,如果没有调整
- 立即传递其成员时的右值范围
- 成员变量在超出BeginPlay函数虚幻引擎的范围时丢失值c++
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 对象超出范围后,引用成员设置为 0
- pImpl、范围和隐藏数据成员
- 在命名成员函数重载解析期间,"this"何时不在范围内?
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- 成员的结构与命名空间的潜在范围
- C++奇怪的问题.数据成员超出范围
- 范围视图作为数据成员
- 基于循环的C ISTRINGSTREAM范围没有开始成员
- 为 具有"end"成员变量的类型启用基于范围的
- 如何将成员函数引入范围
- 如何基于每个成员覆盖类范围的__declspec(dllexport)注释?
- 从对象本身访问成员或成员范围
- c++单元测试:改变成员范围
- 在不更改成员范围的情况下有条件地启用静态成员