Возможно, я не понимаю назначение const
в методах класса.
Допустим, я хочу реализовать контейнер для хранения объектов типа Foo
, но мой контейнер обещает не изменять ни одно изFoo
сами объекты.
struct Foo
{
int faz;
Foo() : faz(0) {}
};
class FooContainer
{
public:
FooContainer() : _foos(), _numFoos(0) {}
void addFoo(const Foo* foo)
{
_foos[_numFoos] = foo;
_numFoos++;
}
private:
const Foo* _foos[10];
int _numFoos;
};
int main()
{
FooContainer fc;
Foo foo;
fc.addFoo(&foo);
return 0;
}
Это прекрасно работает, пока я не захочу вытащить Foo
из контейнера и что-то с ним сделать. Допустим, я добавляю метод к FooContainer
:
Foo* getFoo(int index) const
{
return _foos[index];
}
Я получаю сообщение об ошибке, в котором говорится, что я пытаюсь преобразовать const Foo*
в Foo*
, что, по-моему, верно из-заreturn
.
Итак, я поставил перед ним const
:
const Foo* getFoo(int index) const
{
return _foos[index];
}
Отлично, это работает. Теперь попробуйте получить Foo
и сделать что-то с ним в main()
:
Foo* foo2 = fc.getFoo(0);
Теперь я получаю ту же ошибку, конвертируя из const Foo*
в Foo*
. Я снова согласен. Но, конечно, если я поставлю const
перед моим foo2
, я не смогу изменить содержимое foo2
.
const Foo* foo2 = fc.getFoo(0);
foo2->faz = 3; // error: assignment of member 'Foo::faz' in read-only object
Итак, как мне сказать своим пользователям, что яне хотите поменять их драгоценные предметы внутри моего контейнера?
Я пытался сделать _foos
не-const
, но сохранил const
на addFoo(const Foo* foo)
, но все равно получил недопустимое преобразование из const Foo*
до Foo*
.