Mixin C++
От: _nn_ www.nemerleweb.com
Дата: 22.09.09 20:04
Оценка:
Имеется следующая иерархия:

struct a
{
 a(int x)

 void f(int x)
 {
  if(x>0) g(x);
  else h(x);
 }

protected:
 virtual void g(int x) {}
 virtual void h(int x) {}
};

struct b : a
{
 b(int x) : a(x) {}

protected:
 virtual void g(int x) { do_something }
 virtual void h(int x) { do_something }
}


Мне нужно проверить что функции g, h вызываются.
Можно сделать просто наследование:

struct с : b
{
 c(int x) : a(x) {}

protected:
 virtual void g(int x) { b::g(x) }
 virtual void h(int x) { b::h(x) }
}


Но понадобилось для двух иерархий.
Поэтому решил сделать шаблон:
template<typename T>
struct add_check
{
protected:
 virtual void g(int x) { T::g(x) }
 virtual void h(int x) { T::h(x) }
}


Однако такое не сработает, если в классе b не будут определены оба метода.
Т.е.:
struct b2 : a
{
 b2(int x) : a(x) {}

protected:
 virtual void h(int x) { do_something }
};

struct b2_check : b2 , add_check<b2>
{
 b2_check(int x) : b2(x) {}
};
// Error: Cannot access protected method b::g


Все это нужно для теста.
Подскажите как сделать.

Спасибо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Mixin C++
От: Юрий Жмеренецкий ICQ 380412032
Дата: 22.09.09 21:45
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Имеется следующая иерархия:


__>
__>struct a
__>{
__> a(int x)

__> void f(int x)
__> {
__>  if(x>0) g(x);
__>  else h(x);
__> }

__>protected:
__> virtual void g(int x) {}
__> virtual void h(int x) {}
__>};

__>


__>Мне нужно проверить что функции g, h вызываются.

__>Все это нужно для теста.

Если функции неконстантные, то они изменяют состояние объекта. Тест должен проверять имеенно это (выполнение постусловий), а не факт вызова конкретных функций. Соответственно для доступа к состоянию должны существовать какие-либо публичные методы (или другой способ доступа к observable state), которые и должны использоваться в тесте.
Re: Mixin C++
От: Nik_1 Россия  
Дата: 23.09.09 05:53
Оценка:
Здравствуйте, _nn_, Вы писали:
__>Но понадобилось для двух иерархий.
__>Поэтому решил сделать шаблон:
__>
__>template<typename T>
__>struct add_check
__>{
__>protected:
__> virtual void g(int x) { T::g(x) }
__> virtual void h(int x) { T::h(x) }
__>}
__>


__>Однако такое не сработает, если в классе b не будут определены оба метода.

__>Т.е.:
__>
__>struct b2 : a
__>{
__> b2(int x) : a(x) {}

__>protected:
__> virtual void h(int x) { do_something }
__>};

__>struct b2_check : b2 , add_check<b2>
__>{
__> b2_check(int x) : b2(x) {}
__>};
__>// Error: Cannot access protected method b::g
__>


наследуй add_check от b2, а b2_check от add_check(унаследованного от b2).
Re: struct protected
От: DIMEDROLL Украина  
Дата: 23.09.09 07:44
Оценка: :)
Здравствуйте, _nn_, Вы писали:

__>Имеется следующая иерархия:


__>[c]

__>struct a
__>{
__>protected:
__> virtual void g(int x) {}
__> virtual void h(int x) {}
__>};

а что это за конструкция такая, в структуре модификатор доступа?
struct members protected private
Re[2]: Mixin C++
От: _nn_ www.nemerleweb.com
Дата: 24.09.09 16:39
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>наследуй add_check от b2, а b2_check от add_check(унаследованного от b2).


Сделал так:
template<typename Base>
struct add_check : Base
{
 add_check() : Base() {}
 
 template<typename P1>
 add_check(P1 p1) : Base(p1) {}

 // конструкторы просто вызывают базовый класс
 
 bool called_g() const { return g_called; }
 bool called_h() const { return h_called; }
 void reset() { g_called = false; h_called = false; ]

protected:
 virtual void g(int x) { g_called = true; Base::g(x) }
 virtual void h(int x) { h_called = true; Base::h(x) }

 bool g_called;
 bool h_called;
}


Работает как надо.

Напоминаю, нужно это дело для тестов

Спасибо всем за помощью
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: struct protected
От: Erop Россия  
Дата: 24.09.09 17:41
Оценка:
Здравствуйте, DIMEDROLL, Вы писали:

__>>[c]

__>>struct a
__>>{
__>>protected:
__>>};

DIM>а что это за конструкция такая, в структуре модификатор доступа?

Дык в С++ так...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.