вызов неконстантной функции для неконстантного члена в константной функции - PullRequest
0 голосов
/ 15 февраля 2019

Член не является константным, и функция-член не является константной. Когда он вызывается для константной функции-члена, он генерирует ошибку, жалуется на:

error: passing 'const foo' as 'this' argument discards qualifiers [-fpermissive]

код:

// this class is in library code  i cannot modify it
class CWork {
public:
    const string work(const string& args) { // non const
        ...
        return "work";
    }
};
// this is my code i can modify it 
class CObject {
private:
    CWork m_work; // not const
public:
    const string get_work(const string& args) const { // const member function
        return m_work.work(args);  // error here
    }
};

Почему это и как это исправить?Компилятор g ++ 5.3.1.

1 Ответ

0 голосов
/ 15 февраля 2019

Внутри const метода объект (*this) и, следовательно, все его члены const.Подумайте об этом, если бы это было не так, то объект const ничего бы не значил.

Таким образом, m_work - это const внутри get_work, и вы можете вызывать только const методы для него.

Сделать work также методом const.Нет очевидной причины делать это не const, и по умолчанию вы должны использовать методы const.Только когда вам нужно изменить объект, сделайте его не const.

он находится в библиотеке, я не могу его изменить.

В этом случае вам не повезло,Вы также можете сделать get_work неконстантным тоже, потому что work, кажется, изменяет m_work, следовательно, изменяет ваш CObject, что вы не можете сделать методом const.

...