Getter工作,但当我把它变成const

时间:2015-12-25 23:09:11

标签: c++ c++11 initialization const getter

所以我目前正在开发一个so和dll文件来处理我的用户文件(基本上是一个文件系统)。 我有两个类,一个是 FileData (代表一个文件),另一个是 FileList (顾名思义就是FileDatas列表)。这是我的问题。我的代码正在运行,但我需要实现一个基于我在文件中获取的元数据的排序方法,为此我需要将我的getter用于 const方法

我正在使用标志进行编译 -Wextra -Wall -Werror

FileData.hpp

class FileData
{
 // ...
 std::vector<std::pair<std::string, std::string> > _metadatas;
public:
 FileData(std::string);
 ~FileData();
 FileData(const FileData &);
 std::vector<std::pair<std::string, std::string> > &getMetadatas() const;
};

FileData.cpp (我试图同时返回(_metadatas)和(&amp; _metadatas)都失败了)

std::vector<std::pair<std::string, std::string> > &FileData::getMetadatas() const
 {
   return (_metadatas);
 }

以下是错误消息

 FileData.cpp: In member function ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >& FileData::getMetadatas() const’:
 FileData.cpp:164:23: error: invalid initialization of reference of type ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >&’ from expression of type ‘const std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >’
 return (_metadatas);
                    ^
make: *** [FileData.o] Error 1

这就是我的FileList.cpp中的原因我需要让getMetadatas成为一个const getter(尽管我知道getter总是应该是const):

FileList.cpp

bool                SortMetadata::sortArtist(const FileData &a, const FileData &b)
{
   int i,j;
   std::vector<std::pair<std::string, std::string> > tmp, temp;
   tmp = a.getMetadatas();
   temp = b.getMetadatas();
   std::string first("");
   std::string second("");
   for (i = 0; i < tmp.size(); ++i)
    {
       if (tmp[i].first.compare("artist") == 0)
           first = tmp[i].second;
    }
   for (j = 0; j < temp.size(); ++j)
    {
        if (temp[j].first.compare("artist") == 0)
            second = temp[j].second;
    }
   return (first.compare(second) < 0);
}

如果我没有让我的getMetadatas()成为const方法,那么这是错误消息

 FileList.cpp: In function ‘bool SortMetadata::sortArtist(const FileData&, const FileData&)’:
 FileList.cpp:91:26: error: passing ‘const FileData’ as ‘this’ argument of ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >&  FileData::getMetadatas()’ discards qualifiers [-fpermissive]
 tmp = a.getMetadatas();
                      ^
 FileList.cpp:92:27: error: passing ‘const FileData’ as ‘this’ argument of ‘std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > >& FileData::getMetadatas()’ discards qualifiers [-fpermissive]
 temp = b.getMetadatas();

我不确定这里的问题是什么,因为代码在我将getter改为const之前工作正常,而且我不明白它变为const的是什么,因为方法只是一个回报.. 感谢帮助人员!

1 个答案:

答案 0 :(得分:0)

  1. 您无法从const getter 1 返回对非const成员的引用。您可以有两个重载(const和非 - const):

    std::vector<std::pair<std::string, std::string> > &      getMetadatas();
    std::vector<std::pair<std::string, std::string> > const& getMetadatas() const;
    

    但我认为您甚至不想要第一次重载,而您只是忘记了返回类型中的一个const

  2. 正如@ M.M注意到的那样,在返回引用时不使用address-of运算符:

    return _metadatas;
    
  3. (1)这是因为如果可能的话,你会使用以下代码违反const-correctness:

    const FileData fd;
    fd.getMetadatas() = {}; // you're modifying a const object