2016-07-08 69 views
-1

好的,基本上我已经在互联网上搜索了所有东西,但是我至少没有发现能够很好​​地解释它或者完全解释它的东西。以类名称作为参数的函数

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

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

修改(BOOKONE,12,5,2017)

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

我真的不知道如何看起来像。

这里的主要问题,因为我知道我可以在解释的东西不好:

修改(?????,诠释的x,INT Y,INT Z)

+0

为什么你不能将一个对象作为参数给一个函数? 'void modify(book book,int x,int y,int z)'工作得很好。如果你想传递一个引用而不是副本,或者'void modify(book&theBook,int x,int y,int z)'。 – immibis

+2

简短的答案在这里:写你自己的代码来做到这一点。 C++ [没有反射](https://en.wikipedia.org/wiki/Reflection_(computer_programming))。您需要实现自己的映射不透明字符串(或其他性质的标识符)的机制到离散对象中。 –

+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 d书books,或自动,如果不存在,创建name d书,然后调用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; 
    } 
} 

这具有在处理一个显著的性能损失如果不知名的书籍经常被抬头,那么这个例外是不寻常的。正如名称所暗示的那样,例外只应用于例外事件。更多关于为什么可以在这里阅读,如果感兴趣: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++进行开发,否则不应该有任何意外。

+1

如果'books'中不存在'name',则访问'books [name]'将创建一个新的'book'对象。如果你不想发生这种情况,可以使用'books.find(name)'代替:'std :: map :: iterator iter = books.find(name); if(iter!= books.end())iter.second.setreleasedate(day,month,year);' –

相关问题