您如何访问矢量对象的成员变量并对其进行重载?

时间:2019-12-03 05:38:41

标签: c++ vector struct member

我有一个名为point的结构,并且正在尝试重载istream运算符,但无法访问xy变量。

struct point {
    int x;
    int y;
    point(int x = 0, int y = 0)
            : x{x}, y{y}
        {}
};

std::istream& operator>>(std::istream& is, const std::vector<point> &d){
    return is >> d.x >> d.y;  //error const class std::vector<point> has no member named x or y
}

2 个答案:

答案 0 :(得分:1)

is >> d.x >> d.y

不起作用,因为d的类型为std::vector<point>,而不是pointstd::vector<point>没有成员变量xypoint可以。这些是句法问题。更为重要的问题是:如何通过从文件中读取对象来填充std::vector<point>

我可以想到以下选项:

  1. 不要假设在输入流中可以找到point个对象。尽可能多地读取point对象,并将它们添加到std::vector<point>

  2. 假定仅存在point个对象的已知数量,这些对象可以进行硬编码或通过其他方式获得。在这种情况下,请阅读所有内容(假设它们可以成功读取),然后将其添加到std::vector<point>中。

  3. 从流本身读取point对象的数量。假设可以从流中读取point的数量。然后,读取预期数量的point对象(假设可以成功读取它们),并将它们添加到std::vector<point>中。

在所有这些情况下,您都需要能够从流中读取point。为此,我建议,

std::istream& operator>>(std::istream& is, point& p)
{
   return is >> p.x >> p.y;
}

要从流中填充std::vector<point>,必须从第二个参数中删除const。您需要

std::istream& operator>>(std::istream& is, std::vector<point>& d)
{
   // Implement the appropriate strategy here to read one point object
   // at a time and add them to d.
   // For the first strategy, you'll need:
   point p;
   while ( is >> p )
   {
       d.push_back(p);
   }
}

答案 1 :(得分:0)

我认为,理想情况下,您应该将运算符重载功能作为朋友的功能。