Как получить неконстантный итератор при использовании константного «this» указателя? - PullRequest
1 голос
/ 29 марта 2012

Моя проблема заключается в использовании const_cast <>. У меня есть класс, который наследует от вектора. Теперь в одной из его функций-членов, когда я использую this->begin(), this как постоянный указатель, он возвращает постоянный итератор, но я хочу получить неконстантный итератор. Код выглядит примерно так ...

class xyz : private std::vector<//something>
{
public:
 xyz();
 void doSomething();
}

void doSomething()
{
    xyz::iterator it;
    it = this->begin();
    *it.insert(something); //here is the problem and this where I need to use const_cast 
                           // and in a lot more places
}

В приведенной выше функции, поскольку this->begin() возвращает константный итератор, я вынужден использовать постоянный итератор и выполнять типизацию, когда мне нужно вставить элемент.

Я думал об использовании const_cast в this-> begin (), но мой друг сказал мне, что удаление константы указателя this - плохая идея. Если это так, то какой путь?

1 Ответ

1 голос
/ 29 марта 2012

Если вектор является частью состояния класса, либо как член, либо в качестве основы (хотя это действительно плохая практика публично наследовать от vector), тогда функция-член const не должна ее изменять. Если вектор является частью состояния, и функция изменяет его, функция не должно быть постоянным.

Вообще. Существуют особые случаи, когда, например, вектор представляет кэшированное состояние, которое вычисляется логически, но чье Расчет стоит дорого. В таких случаях вы можете сделать вектор изменчивый член. Но убедитесь, что вектор действительно не представляет "наблюдаемое состояние".

И, наконец, код, который вы публикуете, не имеет никакого отношения к эта проблема. Для начала, единственная функция неконстантна. И код не будет компилироваться по нескольким причинам (использование this в не-члене функция, вызов функции-члена insert на итераторе, который нет такого члена и т. д.).

...