具有类名作为参数的函数

时间:2016-07-08 00:14:35

标签: c++

好吧,基本上我已经在互联网上搜索了一下,但我发现没有任何真正能够解释得很好或根本没有,至少对我的情况而言。

我们只是说我们有一个名为book的课程。我们向该类添加两个对象(每个对象具有标题和发布日期(发布日期写为日,月,年)。

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

修改(BOOKONE,12,5,2017)

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

我真的不知道那会是怎样的。

这是主要问题,因为我知道我在解释这些内容方面很难:

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

1 个答案:

答案 0 :(得分:3)

您可以将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
}

这会在name中找到books d本书,或者如果它不存在则自动创建name d本书,然后调用book&#39 ; s设置发布日期的方法。

如果您不希望动态创建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;
    }
}

如果经常查阅未知书籍,这在处理例外方面会有显着的性能损失 - 因为未知书籍并不例外。正如名称所暗示的那样,异常仅应用于特殊事件。如果感兴趣,可以在此处阅读更多有关原因的信息:Are Exceptions in C++ really slow

这也需要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 ++进行开发,否则不应该出现任何意外。