[英]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::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;
}
}
如果经常查找未知书籍,则在处理异常时会大大降低性能,因为在未知书籍中并不例外。 顾名思义,异常仅应用于例外事件。 如果有兴趣,可以在这里阅读更多为什么要阅读的内容: 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.