调用常量对象的set方法

时间:2016-12-01 06:33:43

标签: c++ const stdvector

我正在执行一项任务,我将获得初学者代码并要求填写。初学者代码有三个功能,要求我向项目添加varargs并且它们都相似但是对于不同的多态对象。

 48 void Library::addKeywordsForItem(const Item* const item, int nKeywords, ...)
 49 {
 50     // the code in this function demonstrates how to handle a vararg in C++
 51
 52     va_list     keywords;
 53     string      keyword;
 54     bool        successFlag = false;
 55     sArray      keywordV;
 56
 57     va_start(keywords, nKeywords);
 58     for (int i = 0; i < nKeywords; i++) //This code adds the items to a map of set to create a fast access structure for keyword searches
 59     {
 60         keyword = va_arg(keywords, string);
 61         // do something with each keyword
 62         keywordV.push_back(keyword); //pushes keyword onto vector
 63         successFlag = addToSMap(item, keyword, keywordDbase); //This function is literally a copy/paste of the code
 64         //originally designed for this function
 65     }
 66     va_end(keywords);
 67
 68     const Item item2 = *item; //pointless attempt to circumvent const
 69
 70     item2.setKeywords(keywordV); //sends finished and unsorted vector into item object
 71
 72     if(!successFlag) //Should never execute
 73         cout << "This code reeks verily of wrongness.\n";
 74 }

我的问题是函数参数指定了一个const对象指针,因此当我尝试调用setKeywords时,我收到以下错误。

Library.cpp: In member function ‘void Library::addKeywordsForItem(const Item*, int, ...)’:
Library.cpp:70:28: error: passing ‘const Item’ as ‘this’ argument discards qualifiers [-fpermissive]
  item2.setKeywords(keywordV); //sends finished and unsorted vector into item object
                            ^
In file included from Library.h:9:0,
                 from Library.cpp:4:
Item.h:30:7: note:   in call to ‘void Item::setKeywords(sArray&)’
  void setKeywords(sArray& keywords); //Takes unsorted vector
       ^~~~~~~~~~~

我的问题是该程序的输出要求对象存储其关键字,以便我可以打印它。 我理解,const的全部要点是阻止我改变对象。

如果所有采用Item*varargs的函数(这是唯一可以处理添加向量的函数)都是{{I>我应该如何添加输出所需的数据{ {1}}?有没有人有任何想法?

P.S。 constsArray,这项任务是关于多态的。由于vector<string>,我遇到了dynamic_cast的问题,但这是另一个问题。

编辑:我们没有明确禁止更改功能,但如果我这样做,那么提供的许多其他代码都会中断。

值得注意的是,此代码旨在在Visual Studio上运行,并在Vim上进行编辑。很可能教师很少或根本没有检查确保分配在Linux上运行。

0 个答案:

没有答案