Есть ли способ избавиться от постоянства виртуальных функций-членов - PullRequest
1 голос
/ 16 сентября 2011

Мне нужно реализовать макет для интерфейса, который определяется примерно так:

class Foo
{
public:
  void sendEvent(int id) const = 0;
}

Мой класс-макет должен сохранить все идентификаторы событий, отправленные в класс.Вот как я собирался это сделать.

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

}

Но, очевидно, компилятор отказывается от этой конструкции.Есть ли какие-либо решения для этого (при условии, что интерфейс не может быть изменен)?

Я понимаю, что могу использовать два класса для этого.Но разве нет способа закрыть компилятор и разрешить мне это, подобно const_cast?

Ответы [ 4 ]

6 голосов
/ 16 сентября 2011

Вы можете сделать вектор mutable, чтобы его можно было изменить из методов const, например:

mutable std::vector<int> m_vector;

Обратите внимание, что это делает вектор изменяемым из all методы.Если вы хотите записать в него только один метод, const_cast менее инвазивен, поскольку вы отбрасываете константу this только для одного вызова:

FooMock * const that = const_cast<FooMock * const>(this);
that->m_vector.push_back(id);

I'mбудучи немного педантичным здесь - внутри метода const, this имеет тип T const * const (поэтому и объект, на который указывает указатель, и сам указатель являются константой).const_cast просто отбрасывает константу объекта, но не указателя.

2 голосов
/ 16 сентября 2011

Другой метод без изменяемого (когда он недоступен) и 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);}
}

Когда это возможно, я бы использовал mutable для насмешек.

1 голос
/ 16 сентября 2011

постоянство функции-члена равно части сигнатуры функции. Вы не можете избавиться от этого.

Однако вы можете определить элемент как mutable, который вы хотите мутировать в функции-члене const. Ключевое слово mutable сделает член изменяемым / изменяемым даже в функции const-member и даже если объект является const.

0 голосов
/ 16 сентября 2011

Вы можете пометить m_vector как mutable:

mutable std::vector<int> m_vector;

mutable порождает немного противоречий, подобных const_cast, и приводит к теоретической дискуссии о том, что действительно означает быть const. По сути, это было бы оправдано, если внешнее поведение остается константным, что, как я полагаю, является верным, глядя на этот пример.

...