Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > задача на собеседовании


Автор: Paspartu 18.6.2010, 20:19
Доброго времени суток!
Вот получил такую задачу:

//*******************************************************************************************************
Есть классы C1, С2, С3..... СN  с функциями 
F1, F2, F3, ..... , FN

Прототипы функций могут быть разными(максимальный набор параметров = 2 штуки, типы параметров неизвестны)

Задача: 
1.       Организовать контейнер, элементами которого будут пары: один из экземпляров класса Cx и одна из функций Fx
2.       Написать цикл, который пробегается по элементам контейнера и вызывает нужные методы
(параметры этих функций задаются на этапе добавления объекта в контейнер) соответствующих экземпляров класса

Ограничения:
Нельзя использовать bost, qt,  можно только stl
Метод четкого вызова функций путем case, if - применять нельзя
Напрямую рассчитывать адрес вызываемой функции нельзя

Дополнение:
                Использует один человек, разрабатывает контейнер другой человек (он ничего не знает ни о классах C ни о 
возможном количестве функций F и их параметров)

//*******************************************************************************************************

Помогите, перевести ее на русский язык… 
1. Не могу понять функции F1, F2, F3, ..... , FN это члены класса или как?
Просто мне интересно, как ее помете вы…

Автор: Paspartu 18.6.2010, 20:55
1.       Организовать контейнер, элементами которого будут пары: один из экземпляров класса Cx и одна из функций Fx
- вроде Fx - не является членном класса, НО!

2.       Написать цикл, который пробегается по элементам контейнера и вызывает нужные методы
(параметры этих функций задаются на этапе добавления объекта в контейнер) соответствующих экземпляров класса
- если опустить то что в скобках получаем:
Написать цикл, который пробегается по элементам контейнера и вызывает нужные методы соответствующих экземпляров класса
- выходит что они являются членнами класса!

Или я туплю...

Автор: Abyx 18.6.2010, 21:57
если речь о С++0х, то там в stl есть function и bind
если речь о С++98, то пишем их сами

Добавлено @ 22:09
Код

class AbstractFunction
{
public:
    virtual void invoke() = 0;
    //virtual ~A() {};
}
template<class T>
class Function0 : AbstractFunction
{
public:
   typedef void(T::*f_t)();
   Function(T* t, f_t f) : t_(t), f_(f) {}
   void invoke() {(t_->*f)();}
private:
   T* t_;
   f_t f_;
}
template<class T, typename A1>
class Function1 : AbstractFunction
{
public:
   typedef void(T::*f_t)(A1);
   Function(T* t, f_t f, A1 a1) : t_(t), f_(f), a1_(a1) {}
   void invoke() {(t_->*f)(a1_);}
private:
   T* t_;
   f_t f_;
   A1 a1_;
}

class Container
{
public:
//.......

template<class T>
void append(T* t, Function0<T>::f_t f)
{
     impl_.push_back(new Function0<T>(t, f));
}
template<class T, typename A1>
void append(T* t, Function1<T>::f_t f, A1 a1)
{
     impl_.push_back(new Function1<T>(t, f, a1));
}

private:
     vector<AbstractFunction*> impl_;
}

Автор: Paspartu 19.6.2010, 15:46
Abyx, спасибо, но у тебя в результате получился вектор указателей, а исходя из условия задачи в векторе(контейнере) должен жить сам объект...
возможно ли запихнуть в вектор объекты разных классов? Или возможно ли инстанцировать вектор шаблоном? т.е. изночально создать некую шаблонную структуру в которой будет сам объект, указатель на его функцию и параметры, затем эту структуру запихивать в вектор?

Автор: borisbn 19.6.2010, 18:39
Stl-контейнеры не могут хранить объекты типов, которые нельзя привести друг к другу.
Ключевым словом в задании является: "Организовать" (читай "создать", "разработать") контейнер ...

P.S. IMHO тут ни boost ни Qt не помогут

Автор: mes 19.6.2010, 19:01
Цитата(Paspartu @  19.6.2010,  14:46 Найти цитируемый пост)
, а исходя из условия задачи в векторе(контейнере) должен жить сам объект...

Цитата(Paspartu @  18.6.2010,  19:19 Найти цитируемый пост)
, элементами которого будут пары: один из экземпляров класса Cx и одна из функций Fx



Автор: bsa 19.6.2010, 21:46
Это можно сделать сделав свой аналог std::list, элементами которого будут объекты шаблонного класса, наследника от базового элемента:
Код
struct BaseElement
{
    virtual ~BaseElement(){}
    virtual void invoke() = 0;
    BaseElement *prev;
    BaseElement *next;
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)