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

标签 c++ virtual-functions const-correctness

我需要为定义如下的接口(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/

相关文章:

c++ - 如何在 C++ 中创建一个允许多态返回不同类型的工厂方法?

c++ - 从 V 表调用虚函数

c++ - 一个对象能知道它自己的常量吗?

c++ - 我不明白这些编译错误

c++ - 如何分配具有执行权限的内存?

c++ - 使用 DWORD_PTR

c++ - C++ 中复制对象的动态绑定(bind)

c++ - 关于 C++ 中的纯虚函数的问题?

c# - 持续引用的最佳方法或替代方案是什么?

c++ - 是否值得插入 `const` -正确性