Использование неконстантного объекта для константного параметра - PullRequest
0 голосов
/ 12 ноября 2019

Возможно, я не понимаю назначение 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*.

1 Ответ

2 голосов
/ 12 ноября 2019

Итак, как мне сказать своим пользователям, что я не собираюсь менять их драгоценные предметы внутри моего контейнера?

Вы не должны и не должны. Ваш контейнер делегирует передачу своих драгоценных предметов кому-то другому, поэтому он не должен давать обещание, которое не намерен выполнять.

...