【问题标题】:Dereferencing vector pointers with a range based for loop使用基于范围的 for 循环取消引用向量指针
【发布时间】:2019-11-09 08:46:16
【问题描述】:

这是我的 main() 函数的代码:

std::map<int, std::string> candyMap;
std::vector<House*> houseVector;
std::ifstream abodeFile{houseFile};
std::string houseLine;
if(abodeFile.is_open())
{
    while(getline(abodeFile, houseLine))
    {
        houseVector.push_back(new House(houseLine, candyMap));
    }
}

std::cout << std::setw(11) << " ";
for(auto i:houseVector)
{
    std::cout << std::setw(11) << i;
} 

我正在尝试打印出 houseVector 中的元素。显然,通过上面的代码,我得到了元素的地址。当我执行*i 时,我收到&lt;&lt; 的操作员错误。此处取消引用的正确方法是什么?

【问题讨论】:

  • 您需要为House 重载operator&lt;&lt;。或者使用i-&gt;member一一打印其所有成员。
  • 你想通过 cout 一个对象看到什么?

标签: c++ pointers dereference


【解决方案1】:

你需要重载ostream &lt;&lt;操作符,例如:

class House
{
    int member;
public:
    explicit House (int i) : member(i) {}
    friend ostream& operator<<(ostream& os, const House& house);
};

ostream& operator<<(ostream& os, const House& house)
{
    os <<house.member << '\n';
    return os;
}

直播Godbolt


或者没有朋友:

class House
{
    int member;
public:
    explicit House (int i) : member(i) {}

    std::ostream &write(std::ostream &os) const { 
        os<<member<<'\n';
        return os;
    }
};

std::ostream &operator<<(std::ostream &os, const House& house) { 
     return house.write(os);
}

直播Godbolt

【讨论】:

  • 我要访问的成员是私有的
  • @turing042 你应该把这个重载作为众议院的成员。
  • @OblivionreinstateOurMonica:你不能让它成为 House 的成员,因为 House 不是第一个参数。但是你可以让它成为朋友(当然,你可以在类定义中实现那个朋友)。请注意,即使您在类定义中将其定义为朋友,它也不会成为成员(例如,您无法使用 House::operator&lt;&lt; 访问它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多