【问题标题】:Printing abstracted objects c++打印抽象对象 c++
【发布时间】: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


【解决方案1】:

inventory.insert(std::pair&lt;Auto_Part*, int&gt;(part, 1));

-> x.firstAuto_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&amp; x 而不是auto x

【讨论】:

    【解决方案2】:

    pairfirst 元素是一个指针元素。因此,当您将其传递给 &lt;&lt; 运算符时,它会打印内存地址。

    最简单的解决办法是改变

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

    在你的重载运算符中使用

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

    否则,您必须修改整个数据结构以直接保存对象而不是指针。

    【讨论】:

      【解决方案3】:

      正如@molbdnilo 指出的那样,您在每对中存储一个指针和一个 int。

      您只需在将其传递给 operator&lt;&lt; 之前取消引用该对的 first

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

      【讨论】:

      • 好的,所以它打印了,但它只打印了 auto_part 类的默认构造函数,而不是每个派生类的唯一字段。我尝试将 virtual 关键字添加到 inventory::add_part() 函数中,但随后出现分段错误。有任何想法吗?我将编辑原始帖子以显示新输出和预期输出。
      • @user242424 在您的汽车零件类中,您需要一个虚拟的operator&lt;&lt;。不幸的是,拥有这样一个会迫使你做part &lt;&lt; stream;显然不是你想要的......解决方法:从 operator
      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 2019-04-26
      • 2023-03-27
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多