C++ 有没有办法消除虚成员函数的常量

C++ 有没有办法消除虚成员函数的常量,c++,virtual-functions,const-correctness,C++,Virtual Functions,Const Correctness,我需要为定义如下的接口实现一个模拟: 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);} } 类FooMoc

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

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);}

}
类FooMock:Foo
{
私人:
m_向量std::向量;
公众:
void sendEvent(int id)const{m_vector.push_back(id);}
}
但显然编译器拒绝这种构造。是否有解决方案(假设接口无法更改)


我意识到我可以使用两个类来实现这一点。但是,有没有一种方法可以关闭编译器并允许我这样做,类似于const_cast?

您可以使向量
可变
,以便可以从const方法中修改它,如下所示:

mutable std::vector<int> m_vector;

我在这里有点迂腐-在一个const方法中,
this
的类型是
T const*const
(因此指向的对象和指针本身都是const)。
const\u cast
只是丢弃对象的常量,而不是指针的常量。

您可以使向量
可变
,以便可以从const方法中修改它,如下所示:

mutable std::vector<int> m_vector;

我在这里有点迂腐-在一个const方法中,
this
的类型是
T const*const
(因此指向的对象和指针本身都是const)。
const\u cast
仅丢弃对象的常量,而不是指针的常量。

您可以将
m\u向量
标记为
mutable

可变std::vector m_vector


mutable
产生了一点类似于
const\u cast
的争议,并导致了一点关于它到底是
const
的理论讨论。基本上,只要外部行为保持不变,这里就可以证明这一点,我假设在这个例子中是正确的。

您可以将
m_向量
标记为
可变的

可变std::vector m_vector


mutable
产生了一点类似于
const\u cast
的争议,并导致了一点关于它到底是
const
的理论讨论。基本上,只要外部行为保持常量,这里就可以证明这一点,我假设在这个例子中是正确的。

成员函数的常量是函数签名的一部分。你无法摆脱它


但是,您可以将成员定义为
mutable
,希望在常量成员函数中对其进行变异。关键字
mutable
即使在常量成员函数中,即使对象是常量,也会使成员可变/可修改。

成员函数的常量是函数签名的一部分。你无法摆脱它


但是,您可以将成员定义为
mutable
,希望在常量成员函数中对其进行变异。关键字
mutable
即使在常量成员函数中,即使对象是常量,也会使成员变为可修改的。

另一个不带mutable的方法(如果不可用)和常量cast使用指针成员。尖头人不跟着警察走

class FooMock : Foo
{
private: 
  boost::scoped_ptr<std::vector<int> > m_vector;
public:
  FooMock() : m_vector(new std::vector<int>) { }
  void sendEvent(int id) const {m_vector->push_back(id);}
}
类FooMock:Foo
{
私人:
boost::作用域_ptr m_向量;
公众:
FooMock():m_向量(新std::vector){}
void sendEvent(int id)const{m_vector->push_back(id);}
}

如果可能的话,我会使用mutable进行模拟。

另一个没有mutable的方法(如果不可用)和const_cast是使用指针成员。尖头人不跟着警察走

class FooMock : Foo
{
private: 
  boost::scoped_ptr<std::vector<int> > m_vector;
public:
  FooMock() : m_vector(new std::vector<int>) { }
  void sendEvent(int id) const {m_vector->push_back(id);}
}
类FooMock:Foo
{
私人:
boost::作用域_ptr m_向量;
公众:
FooMock():m_向量(新std::vector){}
void sendEvent(int id)const{m_vector->push_back(id);}
}

如果可能,我会使用mutable进行模拟。

mutable!我早该知道的。谢谢!易变!我早该知道的。谢谢!事实证明可变是不可能的,因为我们工作在一个完全不支持可变的模型驱动环境中;很好,我没有意识到这种可能性。谢谢@埃里克:
mutable
是否解决了这个问题?我觉得奇怪,它解决不了这个问题。。。但你的评论是这样说的,另一方面,你接受了一个建议使用
mutable
的答案。。。如果
mutable
没有解决它,为什么?
const
存在是有原因的吗?设计师是不是仅仅因为它更漂亮就把常量放在这里了?因为我们工作在一个完全不支持可变的模型驱动环境中,所以可变是不可能的。但是const_cast(this)->m_vector.push_back(id);很好,我没有意识到这种可能性。谢谢@埃里克:
mutable
是否解决了这个问题?我觉得奇怪,它解决不了这个问题。。。但你的评论是这样说的,另一方面,你接受了一个建议使用
mutable
的答案。。。如果
mutable
没有解决它,为什么?
const
存在是有原因的吗?设计师是不是仅仅因为它更漂亮就把
const
放在这里了?