我需要为定义如下的接口(interface)实现模拟:
class Foo
{
public:
void sendEvent(int id) const = 0;
}
我的模拟类需要保存所有发送到类的事件 ID。这就是我打算这样做的方式。
class FooMock : Foo
{
private:
m_vector std::vector<int>;
public:
void sendEvent(int id) const {m_vector.push_back(id);}
}
但显然编译器拒绝这种构造。是否有任何解决方案(假设无法更改接口(interface))?
我意识到我可以为此使用两个类。但是有没有办法关闭编译器并允许我这样做,类似于 const_cast?
最佳答案
您可以使 vector 可变
,这样它就可以在 const 方法中修改,如下所示:
mutable std::vector<int> m_vector;
但是请注意,这会使 vector 在所有 方法中可变。如果您只想从单个方法写入它,const_cast
的侵入性较小,因为您只需一次调用就可以将 this
的常量抛开:
FooMock * const that = const_cast<FooMock * const>(this);
that->m_vector.push_back(id);
我在这里有点迂腐 - 在 const 方法中,this
的类型为 T const * const
(因此指向的对象和指针本身是常量)。 const_cast
只是丢弃了对象的常量性,而不是指针的常量性。
关于c++ - 有没有办法摆脱虚拟成员函数的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7446482/