У меня есть два класса TestClass
и OtherClass
, где TestClass
имеет переменную-член типа OtherClass
с именем m_otherClass
.Обратите внимание, что это не , объявленное как const.
В минимальном примере, представленном ниже;когда m_otherClass
является указателем, тогда все компилируется и работает нормально.Если я изменяю это как не указатель, то я получаю ошибки компилятора (изменения закомментированы в минимальном примере):
"Неконстантная функция setOtherMember вызывается для объекта const"
ошибка: передача 'const OtherClass' в качестве аргумента 'this' отбрасывает квалификаторы [-fpermissive] m_otherClass.setOtherMember ();
#include <iostream>
#include <memory>
class OtherClass {
public:
void setOtherMember() {
m_otherMember = 2;
std::cout << "Other member is now 2" << std::endl;
}
private:
int m_otherMember = 0;
};
class TestClass {
public:
TestClass(): m_otherClass(std::make_unique<OtherClass>())
// TestClass()
{}
void myMethod() const {
m_otherClass->setOtherMember();
// m_otherClass.setOtherMember();
}
private:
std::unique_ptr<OtherClass> m_otherClass;
// OtherClass m_otherClass; // If changing to this I get the error!!
};
int main() {
TestClass testClass;
testClass.myMethod();
return 0;
}
Isэто потому, что myMethod()
является const (и затем обещает не изменять какие-либо переменные-члены), тогда как setOtherMember()
не является const и изменяет переменную-член OtherClass
, а затем косвенно также объект m_otherClass
?
Но почему это не дает сбоя тогда, когда m_otherClass
является указателем?И почему ошибка компилятора говорит о том, что передача const OtherClass в качестве аргумента this завершается ошибкой, когда m_otherClass
не был объявлен как const?