C++ 显示在C++;

C++ 显示在C++;,c++,C++,我有一个存储一些对象的小程序,还有一个函数,如果有任何匹配的抽象对象,它应该找到所需的对象,返回第一个找到的或默认的对象。我需要显示它们,但当我使用“显示”功能时,会出现以下错误: no matching function for call to 'show' 以下是主源文件的代码: #include <iostream> #include "object.h" #include "Inventory.h" using namespace std; void fill(Inv

我有一个存储一些对象的小程序,还有一个函数,如果有任何匹配的抽象对象,它应该找到所需的对象,返回第一个找到的或默认的对象。我需要显示它们,但当我使用“显示”功能时,会出现以下错误:

no matching function for call to 'show'
以下是主源文件的代码:

#include <iostream>
#include "object.h"
#include "Inventory.h"

using namespace std;


void fill(Inventory& i)
{
    i.add_item("object", 22, 20, "blue");
    i.add_item("object2", 25, 20, "red");
    i.add_item("object3", 40, 20, "green");

}

void show(object& item)
{
    cout << item.get_modelName() << " "
         << item.get_screenSize()<< " "
         << item.get_capacity() << " "
         << item.get_colour() << " "
         << endl;
}
int main()
{
    Inventory inventory;
    inventory.init();
    fill(inventory);


    object query1;
    query1.init("", 0, 128, "silver");
    show(inventory.find_item(query1));



    object query2;
    query2.init("object", 20, 20, "silver");
    show(inventory.find_item(query2));


#ifndef NDEBUG
    cin.get();
#endif

    return 0;
}
#包括
#包括“object.h”
#包括“Inventory.h”
使用名称空间std;
填空(库存和i)
{
i、 添加_项(“对象”,22,20,“蓝色”);
i、 添加项目(“对象2”,25,20,“红色”);
i、 添加项目(“对象3”,40,20,“绿色”);
}
无效显示(对象和项目)
{

cout
Inventory::find_item
的返回值
iPhone
按值传递,对于
show(Inventory.find_item(query2));
它是一个临时对象,与
show()的
iPhone&item
不匹配

临时对象不能绑定到引用,但可以用于常量引用。并且
show()
不会更改参数的任何内容,您应该将参数类型设置为
const&

void show(const iPhone& item)
{
    cout << item.get_modelName() << " "
         << item.get_screenSize()<< " "
         << item.get_capacity() << " "
         << item.get_colour() << " "
         << endl;
}
void show(常量和项目)
{

cout问题在于,
find\u项
按值返回对象,
show
函数通过引用获取其参数

由于
find_item
函数可以返回默认构造的对象,因此不能将其更改为通过引用返回,因此需要更新
show
函数,以便能够处理临时对象(这是编译器在执行
show(inventory.find_item(query2))
时将创建的对象)

解决方案非常简单:虽然引用不能绑定到临时对象,但常量引用可以。因此,只需更改
show
函数以获取对常量对象的引用:

void show(iPhone const& item) { ... }

当然,它适用于像您这样的简单的
show
函数,它不会修改参数。如果您修改参数,您不能使其保持常量,但您仍然可以通过使用C++11标准中引入的内容将其用于临时对象:rvalue references():


将退货类型设置为
库存。查找\u项目(查询1)
正确。请编辑您的问题,以包含
目录
类定义。此外,我相信编译器实际上会告诉您更多信息。在发布有关生成错误的问题时,请包含完整的错误消息,包括任何信息注释。最后是关于术语的注释:“主类”show不是一个类,它是一个包含
main
函数的源文件。我添加了Inventory.h和Inventory.cpp源文件。
Inventory::init
iPhone::init
?你听说过构造函数吗?这就是它们的用途。而且你那里的基本上是一个映射。你的
iPhone
类型很重要y是一个键,所以正确的做法是实现将其用作
std::map
键所需的功能,并使用
std::map
来代替inventory类。@songyuanyao不,它不是,但对于修改其参数的函数,但有时会使用临时对象调用(其中更改被简单地丢弃)没有其他方法了。我明白了。是的,这可能对OP的情况有意义。当我使用第一种方法时,它要求我将所有get_xxx()更改为const。因此,我使用了第二种方法,它很有效。非常感谢您的帮助!@bestinhe
get_xxx()
应该是
const
,它们不会改变任何东西,对吗?@songyuanyao现在它们不会改变任何东西,但是当我们使用OOP的其他概念时,它们可能会改变。
void show(const iPhone& item)
{
    cout << item.get_modelName() << " "
         << item.get_screenSize()<< " "
         << item.get_capacity() << " "
         << item.get_colour() << " "
         << endl;
}
void show(iPhone const& item) { ... }
void show(iPhone&& item)  // Note the use of double &&
{
     ...
}