У меня есть следующий класс:Является ли это хорошим вариантом использования «mutable» в C++?
class MyClass
{
private:
mutable int* m_buffer;
public:
MyClass(void)
: m_buffer(nullptr)
{
}
void init(void)
{
m_buffer = new int[10];
}
// This is the only public interface to retrieve m_buffer
const int* evaluate(int param) const
{
for(int i = 0; i < 10; ++i)
m_buffer[i] = param*10;
return m_buffer;
}
};
Я читал, что mutable
члены класса должны быть использован, когда их состояние не влияет на внешнее состояние класса. В приведенном выше коде элемент m_buffer
извлекается только через метод evaluate()
. Этот метод изменит значения m_buffer
, но новые значения зависят только от аргумента param
. Используется ли ключевое слово mutable
в этом конкретном примере?
я мог избежать использования mutable
по:
- Выделяя новый буфер каждый раз, когда я вызываю функцию. Однако это сделает мой код медленным, потому что буфер обычно составляет несколько гигабайт.
- Выделение выходного буфера заранее и передача его в качестве аргумента функции
evaluate
. Однако это сделает мой API более трудным для понимания/использования. - Объявление
m_buffer
какint* const
. Однако это не сработает, потому что из-за конструктивного решения я не могу выделитьm_buffer
в списке инициализаторов конструктора.
Кто отвечает за вызов '' delete' на m_buffer'? Или, другими словами, кто * владеет * 'm_buffer'? –
Тот, кто сделал это «конструкторское решение» о инициализации в функции члена 'init', думает, что он/она работает с C. – Shoe
Я думаю, что концептуально' оценка' * * влияет на внешнее состояние класса. '' '' '' '' эффективно выставляет внутренний 'm_buffer' извне. –