好吧,基本上我已经在互联网上搜索了一下,但我发现没有任何真正能够解释得很好或根本没有,至少对我的情况而言。
我们只是说我们有一个名为book的课程。我们向该类添加两个对象(每个对象具有标题和发布日期(发布日期写为日,月,年)。
好的,我们将分别命名这两个对象BOOKONE和BOOKTWO。我想编写一个接收以下参数的函数,并修改相应对象的内容。
修改(BOOKONE,12,5,2017)
此功能会将BOOKONE的发布日期从当前日期修改为那里的日期。好吧,基本上我不需要函数的内容,但我需要知道如何将对象的名称作为该函数的参数。我需要把它作为一个参数。我不能只创建一个函数并将其称为BOOKOKE.modify。
我真的不知道那会是怎样的。
这是主要问题,因为我知道我在解释这些内容方面很难:
修改( ????? ,int x,int y,int z)
答案 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::at
或std::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 ++进行开发,否则不应该出现任何意外。