Печать абстрактных объектов c ++ - PullRequest
0 голосов
/ 19 октября 2018

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

Type: AA, Name: Energizer, Part Number: 123, Price: 29.99
 - 1
Type: Plain, Name: Rainx, Part Number: 9876, Price: 9.99
 - 1
Type: Round, Name: Firestone, Part Number: 5432, Price: 99.99
 - 1
Type: Tire, Name: Firewheel, Part Number: 6666, Price: 49.99
 - 1
Type: Wheel-Tire, Name: Best Wheel Tire Combo, Part Number: 2424, Price: 199.99
 - 1
Type: Frame, Name: A-Frame, Part Number: 777, Price: 30000
 - 1
Type: Engine, Name: Diesel, Part Number: 4444, Price: 8000
 - 1

Обратите внимание, что каждая часть печатает только 4 поля - поля по умолчанию конструктора Auto_Part.Мои производные классы варьируются от 5 до 8 полей.Я попытался добавить ключевое слово virtual в функцию Inventory::add_part(), но у меня возникла ошибка сегментации: 11.Как это исправить?

У меня есть инвентарь автозапчастей. Я хочу распечатать весь инвентарь, однако моя функция печати печатает адреса памяти вместо значений .

У меня есть класс Auto_Part, который является моим базовым классом, и несколько различных производных классов (Battery, Frame, Engine и т. Д.).Я передавал каждую часть функции Inventory::add_part, используя следующий код:

nventory inventory;
Battery *bat = new Battery("AA", "Energizer", 123, 29.99, 2, 4, 9, 60);

Windshield_Wiper *ww = new Windshield_Wiper("Plain", "Rainx", 9876, 9.99, 24, "Skinny");

Wheel *wheel = new Wheel("Round", "Firestone", 5432, 99.99, "drag", "black", 24, 9, "Crossed");

Tire *tire = new Tire("Tire", "Firewheel", 6666, 49.99, "Drag_Racing", 32, 3, 16, "Great speed", "Loaded");

Wheel_Tire_Combo *wtc = new Wheel_Tire_Combo("Wheel-Tire", "Best Wheel Tire Combo", 2424, 199.99, "Drag Racing", 32, 3, 16, "Slow Speed", "Unloaded?", "Drag" , "black",25, 8, "Bolted");

Frame * frame = new Frame("Frame", "A-Frame", 777, 30000.00, "Solid Frame");

Engine * engine = new Engine("Engine", "Diesel", 4444, 8000.00, 8, "e85");

vector<Auto_Part*> parts;
parts.push_back(bat);
parts.push_back(ww);
parts.push_back(wheel);
parts.push_back(tire);
parts.push_back(wtc);
parts.push_back(frame);
parts.push_back(engine);

for (Auto_Part* ap : parts){
    inventory.add_part(ap);
}

cout << inventory;

Вот моя функция add_part:

void Inventory::add_part(Auto_Part* part)
{
    if(inventory.count(part) == 0)
        inventory.insert(std::pair<Auto_Part*, int>(part, 1));
    else
        inventory.at(part) += 1;
}

А вот моя << перегрузка для печати:</p>

   std::ostream& operator<<(std::ostream& ost, const Inventory& inv)
{
    for(auto x : inv.inventory)
    {
        ost << x.first << " - " << x.second << std::endl;
    }
    return ost;
}

Тем не менее, когда я печатаю, я получаю адреса памяти вместо значений:

0x7fcce1402690 - 1
0x7fcce14026f0 - 1
0x7fcce14027e8 - 1
0x7fcce1402890 - 1
0x7fcce1402998 - 1
0x7fcce14029e0 - 1
0x7fcce1402a40 - 1

Я не уверен, где моя ошибка, хотя я полагаю, что это, вероятно, связано сдля меня не разыменование где-то.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Элемент first вашего pair является элементом указателя.Поэтому, когда вы передаете его оператору <<, он печатает адрес памяти.

Самое простое решение - заменить

ost << x.first << // more code

в вашем перегруженном операторе с помощью

ost << *x.first << // more code

В противном случае вам придется пересмотреть всю структуру данных, чтобы они непосредственно содержали объекты, а не указатели.

0 голосов
/ 19 октября 2018

Поскольку inventory.insert(std::pair<Auto_Part*, int>(part, 1));

-> x.first набрано Auto_Part* -> вам нужно dereference сначала:

std::ostream& operator<<(std::ostream& ost, const Inventory& inv)
{
    for(auto& x : inv.inventory)
    {
        ost << *(x.first) << " - " << x.second << std::endl;
    }
    return ost;
}

Примечание: я использую auto& x вместо auto x.

0 голосов
/ 19 октября 2018

Как указал @molbdnilo, вы храните указатель и целое число в каждой паре.

Вам просто нужно разыменовать first пары, прежде чем передать ее в operator<<

std::ostream& operator<<(std::ostream& ost, const Inventory& inv)
{
    for(auto x : inv.inventory)
    {
        ost << *(x.first) << " - " << x.second << std::endl;
    }
    return ost;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...