编辑-我已经解决了原来的问题,只打印出内存地址而不是打印值,这要感谢你们,但是我仍然没有得到预期的输出。这是我的新输出:
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()
函数中,但是遇到了Segmentation Fault:11错误。我该如何解决?
我有一个汽车零件清单。 我想打印出整个库存,但是我的打印功能是打印内存地址而不是值。
我有一个Auto_Part
类,它是我的基类,还有几个不同的派生类(电池,框架,引擎等)。我使用以下代码将每个部分传递给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;
}
这是我的<<打印超载:
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
我不确定我的错误在哪里,尽管我相信这可能是由于我没有在某个地方取消引用。
答案 0 :(得分:2)
正如@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;
}
答案 1 :(得分:1)
您的first
的{{1}}元素是一个指针元素。因此,当您将其传递给pair
运算符时,它将打印内存地址。
最简单的解决方案是更改
<<
在您重载的运算符中使用
ost << x.first << // more code
否则,您必须修改整个数据结构以直接保存对象而不是指针。
答案 2 :(得分:0)
自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
。