我有以下课程:
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
。答案 0 :(得分:3)
对于您展示的代码,您根本不需要使用mutable
关键字。
在const成员函数中,this
指针是const限定的,那么成员也是const,对于m_buffer
它将是int* const
(注意它&#39; s不是const int*
),这意味着您仍然可以更改m_buffer
指向的值,但不能更改自身。
在evaluate()
中你只是将m_buffer
点改为m_buffer
,而不是{{1}}本身,所以应该没问题。
答案 1 :(得分:-1)
我的观点是,当用户可以定义这样的场景时,这不是一个好主意:
MyClass evaluator;
const int* arrResult1 = evaluator.evaluate(10);
//use of arrResult1
const int* arrResult2 = evaluator.evaluate(15);
//use of arrResult1 and arrResult2
在这种情况下,第二次调用evaluate()
会破坏arrResult1。
您可以这样更改:
class MyClass
{
private:
int* m_resultCache;
public:
MyClass(void)
: m_resultCache(nullptr)
{
}
~MyClass() { delete[] m_resultCache; }
const int* getResult() const { return m_resultCache; }
void evaluate(int param)
{
if (m_resultCache == nullptr)
m_resultCache = new int[10];
for(int i = 0; i < 10; ++i)
m_resultCache[i] = param*10;
}
};