Печать карты объекта, который имеет другой объект в качестве ключа - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь распечатать содержимое моего map <Object, int>.Вот этот код:

void Inventory::print_initial_inventory()
{
    for(auto p : inventory) {
        std::cout << p.first << " : " << p.second << std::endl;
    }
}

std::ostream& operator<<(std::ostream& outstream, Inventory& inv) 
{
    outstream << inv.first << "\nNumber of parts: " << inv.second << std::endl;
    return outstream;
}

Я знаю, что проблема в p.first?потому что std::cout не знает , как напечатать объект , поэтому я попытался перегрузить operator<<, но я не уверен, как это сделать.Кто-нибудь может указать мне правильное направление?

РЕДАКТИРОВАТЬ Вот как я попробовал проблему снова.Мне было предложено передать тип ключа перегрузке operator<<.Вот мой код:

void Inventory::print_initial_inventory()
{
    for(auto x : inventory) {
        std::cout << x.first << " : " << x.second << std::endl;
    }
}

std::ostream& operator<<(std::ostream& outstream, Auto_Part& inv)
{
    outstream << "Type: " << inv.type << "\nName: " << inv.name << "\nPart Number: " << inv.part_number << "\nPrice: $" << inv.price << std::endl;
    return outstream;
}

Я все еще получаю недопустимую ошибку двоичного выражения , указывающую на x.first.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я знаю, что проблема в p.first?потому что std::cout не знает, как напечатать object, поэтому я попытался перегрузить << operator, но я не уверен, как это сделать.

Основы оператораПерегрузка может быть найдена в этом посте: Каковы основные правила и идиомы для перегрузки операторов? Я настоятельно рекомендую прочитать это, прежде чем идти дальше

В вашем случае я обнаружил две основные проблемы:

  1. Вы не упомянули свой класс Key.В частности, как бы вы вставили элемент в std::map (член класса Inventory), если вы не предоставите operator<?Так как класс Key определяется пользователем, вам нужно указать его.Вы можете прочитать больше об этом в этом посте SO: std :: maps с пользовательскими типами в качестве ключа
  2. Второй и основной проблемой вашего кода является отсутствие operator<< для вашего Key типа.Это можно сделать следующим образом:

Например, скажем, class Key

class Key
{
    int member;
public:
    Key(const int a): member(a){}
    // provide operator< for your Key type
    bool operator<(const Key& other)const { return this->member < other.member; }
   // provide operator<< for Key class like follows
    friend std::ostream& operator<<(std::ostream& out, const Key& key);
};
// implement outside the class
std::ostream& operator<<(std::ostream& out, const Key& key)
{
    // simply for this case
    return out << key.member;
}

, и теперь вы можете предоставить operator<< для Inventory класса аналогичным образом..

СМ. ПРИМ. ЖИЗНИ

// now in Inventory class
class Inventory
{
   std::map<Key, int> inventory;
public:
    Inventory(const std::map<Key, int>& m): inventory(std::move(m)) {}
    // declared as friend, so that you can access the private member(map)
    friend std::ostream& operator<<(std::ostream& out, const Inventory& inv);
};
// implement outside the class
std::ostream& operator<<(std::ostream& out, const Inventory& inv)
{
    for(const auto& entry: inv.inventory )
        out << entry.first << " Number of parts: " << entry.second << std::endl;
    return out;
}
// in the main
int main()
{
    Key key1{1};
    Key key2{2};
    std::map<Key, int> tempInvObj{{key1, 11}, {key2, 12}};
    Inventory obj{tempInvObj};
    std::cout << obj;
    return 0;
}

Выход:

1 Number of parts: 11
2 Number of parts: 12
0 голосов
/ 22 сентября 2018

std::cout - это std::ostream объект.std::ostream имеет operator<<, перегруженную по стандарту для некоторых основных типов ( вы можете проверить их здесь ).Если вы хотите использовать operator<< с вашим классом (скажем, class MyType), вы должны перегрузить этот оператор самостоятельно.

Для встроенных типов C ++, таких как std::ostream, вы выполняете такиеперегрузка за пределы класса (потому что в противном случае вам придется изменить std::ostream), и синтаксис для этого:

std::ostream& operator<< (std::ostream& s, const MyType& arg)
{
    /* enter you implementation here */
    return s;
}

Более подробную информацию можно найти здесь .

...