Как использовать метод доступа к объекту, когда этот объект инкапсулирован в константный класс? - PullRequest
0 голосов
/ 04 августа 2020

Позвольте мне сформулировать вопрос более четко.

У меня есть объект Datarow:

 Class Datarow {
    private: 
      vector<string> vals;          

    public:

    std::string getVal(int index); //returns vals.at(index)
    };

У меня есть объект Section, который содержит строки данных:

 Class Section {
    private: 
      vector<Datarow> rows;          

    public:
      //Section methods
    };

И у меня есть перегруженный:

 inline friend std::ostream& Section::operator<<(std::ostream& os, const Section& sec)
 {

   for(auto& row : sec.rows) {
       if( sec.row.getVal(0) == "Tom" )  //<-- error here, c++ doesnt like me calling any method of 
           os << row << endl;       // "row", since sec is const
   }  

 }
 

Предположим, мы также перегрузили оператор << для Datarow. Одним из решений может быть отказ от использования auto &, но копирование «строки» каждый раз может оказаться дорогостоящим, если у меня много строк. Я не смог пройти const Section sec &, но это тоже может быть дорого. Есть ли элегантное решение этой проблемы? </p>

1 Ответ

1 голос
/ 04 августа 2020

Правильный способ сделать это - превратить необходимые Datarow методы в const методы, например:

std::string getVal(int index) const;
                          //  ^^^^^   add this

Теперь эти методы можно вызывать для объекта const, как вы выполняются в operator<<.

Кроме того, ваш operator<< является функцией friend и не должен быть квалифицирован с помощью Section::, например:

friend std::ostream& operator<<(std::ostream& os, const Section& sec)
{
   // ...
}

Кроме того, ключевое слово inline здесь не добавляет ничего полезного, поэтому вы можете его удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...