вектор типа / класса для приведения типов к нулевому указателю - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть программа, которая в настоящее время использует typecast для вектора с нулевым указателем согласно следующему:

(Обратите внимание, что код "главный", я удалил наиболее ненужный контент.

for (i=0;i<NObjects;i++)
{
    switch (ObjectTypes[i])
    {
    case 1:
        ((File_GUI*) (NullVector[i]))->function();
        break;

    case 2:
        ((Point_GUI*) (NullVector[i]))->function();
        break;

    case 3....etc
    }
}

Есть ли способ заменить на большое количество случая 1, случая 2 и т. Д. Простым массивом, который используется для приведения типов? Следовательно, код будет выглядеть примерно так (где, конечно, TypeCastVector должен быть создан ранее и содержать типы данных для каждого индекса i:

for (i=0;i<NObjects;i++)
{
    ((typeCastVector[i]*) (NullVector[i]))->function();
 }

Если возможно, это сэкономит мне тонны строк кода.

Ответы [ 2 ]

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

Я согласен с Kerrek SB, вероятно, требуется редизайн, чтобы использовать для этой цели виртуальный вызов функции и базовый класс.Если по какой-то причине вы действительно не хотите предоставлять File_GUI, Point_GUI и т. Д. Базовый класс, вы можете сделать это ...

struct BaseStorer
{
    virtual void CallFunction() = 0;
};

template<typename T>
struct TypeStorer : public BaseStorer
{
    TypeStorer(T* _obj) : obj(_obj) {}
    virtual void CallFunction() { obj->function(); }

    T* obj;
};

Сохранить массив BaseStorer *, равный new TypeStorer<File_GUI>(new File_GUI(...)).Ваш цикл будет выглядеть как ...

for (i=0;i<NObjects;i++)
{
    baseStorerVector[i]->CallFunction();
}
0 голосов
/ 21 сентября 2011

У меня такое же мнение, как упомянуто в комментариях. В настоящее время ваш ObjectTypes[] кажется массивом (или vector из int с). Возможно, вы захотите изменить его на массив указателей (дескрипторов) общей базы class. Например,

GUI *ObjectTypes[NObjects];

Где class иерархия,

class GUI {  // abstract base class
public:
  virtual void function () = 0; // make it an abstract method
};

class File_GUI : public GUI {
  void function () { ... }
};
...

Теперь вы можете заменить ваш звонок в одной строке как,

for (i=0;i<NObjects;i++)
{
    ObjectTypes[i]->function();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...