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
放在这里了?