Разыменование векторных указателей с диапазоном, основанным на цикле - PullRequest
1 голос
/ 09 ноября 2019

Это код из моей функции 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, я получаю ошибку оператора с <<. Какой правильный способ разыменования здесь?

1 Ответ

2 голосов
/ 09 ноября 2019

вам нужно перегрузить ostream << оператора, например:

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;
}

Live on 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);
}

Live on Godbolt

...