【发布时间】:2019-03-24 03:45:09
【问题描述】:
EDIT-- 多亏了你们,我解决了原来只打印内存地址而不是值的问题,但我仍然没有得到预期的输出。这是我的新输出:
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
我不确定我的错误在哪里,但我相信这可能是由于我没有在某处取消引用。
【问题讨论】:
-
这是因为
first元素是一个指针 (Auto_Part*)。您可能可以弄清楚需要取消引用的内容。 -
与其编辑,不如问一个新问题。到目前为止给出的任何答案都只解决了第一个问题,而新的答案可能只会解决第二个问题。由于您只能接受一个答案,您会接受哪一个?
-
对不起,我不知道。我将创建一个新问题。接受答案的礼仪是什么?第一个发布解决方案的人?投票最多?
-
@user242424 请接受对您最有帮助的答案。不要对其他人的投票或回答者的打字速度给予 ****。
标签: c++ class pointers polymorphism