Простите/поправьте меня, если моя номенклатура неверна.
Я никогда не понимал использование const_cast
. Вообще говоря, мне кажется, что если вы должны использовать const_cast
, то ваш класс/методы, вероятно, в корне ошибочны если только вы не используете устаревшие функции, не являющиеся константно-корректными. Однако я, возможно, наткнулся на случай, когда его использование уместно. У меня есть большой класс с парой членов, которые назначаются во время создания и остаются постоянными в течение полезного срока службы объекта.
Поскольку эти объекты часто уничтожаются и создаются, я хотел бы поэкспериментировать с тем, что, как мне кажется, называется фабричной моделью: вместо создания/уничтожения объекта я хотел бы получить/вернуть его в кэш неназначенных объектов. Например (упрощенно, конечно):
class PersonFactory {
public:
const Person* getPerson(const QString& newname) {
//I can't assign the new name because it's const
if(m_personCache.isEmpty())
return createNewPerson();
else
return m_personCache.pop();
}
void returnPerson(Person* person) { m_personCache.push(person); person = 0; }
static PersonFactory* instance;
private:
Person* createNewPerson() const { return new Person(""); }
QStack<Person*> m_personCache;
}
class Person {
public:
friend Person* PersonFactory::createNewPerson();
const QString& name() const {
return m_name;
}
void destroy() {
PersonFactory::returnPerson(this);
}
private:
Person(QString name) : m_name(name) {}
//m_name is const and should remain that way to prevent accidental changes
const QString m_name;
}
Я не могу назначить новое имя, потому что это const
. Это хороший случай для const_cast
или я упустил очевидную альтернативу? Приведет ли использование const_cast
к снижению производительности?
mutable
не является признаком дефекта конструкции. Это сделано для того, чтобы объекты могли, например, кэшировать значения вместо того, чтобы пересчитывать их каждый раз, когда они нужны. - person Pete Becker   schedule 14.12.2012mutable
, так как она ничего не добавила в вопрос. Конечно, бывают случаи, когда его использование необходимо. - person Phlucious   schedule 14.12.2012std::unique_ptr
иstd::shared_ptr
. таким образом, это оказывает негативное влияние на правильность и объем работы - person Cheers and hth. - Alf   schedule 14.12.2012