有没有办法摆脱虚拟成员函数的常量

Eri*_*ker 1 c++ virtual-functions const-correctness

我需要为一个定义类似的接口实现一个模拟:

class Foo
{
public:
  void sendEvent(int id) const = 0;
}
Run Code Online (Sandbox Code Playgroud)

我的mock类需要保存发送给类的所有事件id.这就是我打算这样做的方式.

class FooMock : Foo
{
private: 
  m_vector std::vector<int>;
public:
  void sendEvent(int id) const {m_vector.push_back(id);}

}
Run Code Online (Sandbox Code Playgroud)

但显然编译器拒绝这种结构.有没有解决方案(假设界面无法更改)?

我意识到我可以使用两个类.但是有没有办法关闭编译器并允许我这样,类似于const_cast?

Fre*_*abe 6

您可以创建向量,mutable以便可以在const方法中对其进行修改,如下所示:

mutable std::vector<int> m_vector;
Run Code Online (Sandbox Code Playgroud)

但请注意,这使得矢量可以从所有方法中变化.如果你只想从一个方法写入它,那么a const_cast的侵入性较小,因为你this只需要为一次调用抛出constness :

FooMock * const that = const_cast<FooMock * const>(this);
that->m_vector.push_back(id);
Run Code Online (Sandbox Code Playgroud)

我在这里有点迂腐 - 在const方法中,this有类型T const * const(因此指向的对象以及指针本身都是const).在const_cast刚刚擅自抛弃的对象常量性,但不是指针.