繁体   English   中英

以类名作为参数的函数

[英]Function with class name as parameter

好的,基本上,我已经在整个互联网上进行了搜索,但是至少对于我的情况,我没有发现任何能够充分或完全解释它的东西。

假设我们有一个名为book的类。 我们向该类添加两个对象(每个对象都有标题和发布日期(发布日期写为日,月,年)。

好的,我们将分别命名这两个对象BOOKONE和BOOKTWO。 我想编写一个函数,接收以下参数并修改各个对象的内容。

修改(BOOKONE,12,5,2017)

此功能会将BOOKONE的发布日期从当前日期修改为那里的日期。 好的,基本上我不需要该函数的内容,但是我需要知道如何将对象名称作为该函数的参数。 我需要将其作为参数。 我不能只是创建一个函数并像BOOKOKE.modify那样调用它。

我真的不知道那会是什么样子。

这是主要问题,因为我知道我可能不擅长解释事情:

修改( ????? ,int x,int y,int z)

您可以制作一本按书名索引的std::map

std::map<std::string, book> books;

接着

bool modify(const std::string &name, int day, int month, int year)
{
    books[name].setreleasedate(day, month, year);
    return true; // always succeeds
}

这将在books找到name d的books ,或者如果name d书籍不存在,则自动创建该name ,然后调用book的方法来设置发布日期。

如果您不希望即时创建book ,则可以选择使用std::map::atstd::map::find

std::map::at版本:

bool modify(const std::string &name, int day, int month, int year)
{
    try
    {
        books.at(name).setreleasedate(day, month, year);
        return true;
    }
    catch(std::out_of_range & ) // did not find named book
    {
        return false;
    }
}

如果经常查找未知书籍,则在处理异常时会大大降低性能,因为在未知书籍中并不例外。 顾名思义,异常仅应用于例外事件。 如果有兴趣,可以在这里阅读更多为什么要阅读的内容: C ++中的异常真的很慢吗?

这也需要C ++ 11标准支持才能获得at方法。

std::map::find版本:

bool modify(const std::string &name, int day, int month, int year)
{
    std::map<std::string, book>::iterator found; // could be auto found if C++11 is enabled
    found = books.find(name)
    if (found != books.end()) // if search ended before the end of books
    {            
        found->setreleasedate(day, month, year);
        return true;
    }
    else // did not find named book
    {
        return false;
    }
}

这个版本需要更多的代码,并始终增加几乎微不足道的成本,但是对于失败的情况不会造成重大损失。

回到开始之初,所有C ++也都支持。 除非您使用Turbo C ++进行开发,否则不会感到惊讶。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM