как передать структуры как полиморфные, когда они не полиморфны в C ++

0

У меня есть сценарий, в котором функция принимает структуру (существующую, существующую), которая является только держателем данных. но функция, которая обрабатывает эти данные, тесно связана с этими данными. Теперь мне нужно обрабатывать дополнительные данные, для которых необходимо расширить структуры (to_be_extended, to_be_extended_helper). Каков наилучший способ добиться этого?

Настоящий код выглядит следующим образом: struct existing {int a; int b; int b; }; };

struct existinghelper
{
int aindex;
int bindex;
};

struct to_be_extended
{
existing e;
int c;
};

struct to_be_extended_helper
{
int aindex;
int bindex;
int cindex;
};

void fun1(existing& e)
{

existinghelper(e);
}

ОЖИДАЕТСЯ: Мне нужен тот же код (fun1) для работы как для расширенных, так и для существующих структур. логически, как показано ниже

void fun1(existing& e ) // can be <to_be_extended & e> this should support both      existing and to_be_extended structure both.
{
existinghelper(e); // or to_be_extended_helper(ee);
//above line should support both existinghelper and to_be_extended_helper structure 

и то и другое./*//логически он должен работать следующим образом:

if(type == existing)

     make existinghelper object.
else
    make to_be_extended_helper object.

The problem is they are not polymorphic and are just data holders.
*/
} 
  • 0
    if(type == existing) ... else ... Это очень распространенный шаблон. Эта модель является причиной, по которой объектно-ориентированное программирование, известное как полиморфизм на основе наследования, было изобретено еще в 1960-х годах. Если вы не хотите повторно использовать идею ООП, вы, вероятно, в итоге плохо ее изобретаете.
Теги:
polymorphism
inheritance

3 ответа

1

Перегрузите функцию для разных типов аргументов:

void fun1(existing& e)
{
   ...
}

void fun1(to_be_extended& e)
{
   ...
}

Если у вас много кода, идентичного для обеих функций, и вы пытаетесь избежать дублирования кода, вы можете включить общую функциональность в шаблон функции.

template<typename T>
void identical_stuff(T& e)
{
    ...
}

void fun1(existing& e)
{
   ... non-identical stuff ...

   identical_stuff(e);
}

void fun1(to_be_extended& e)
{
   ... non-identical stuff ...

   identical_stuff(e);
}
0

Сделайте их полиморфным первым выбором. Если его не требуется, добавьте тип элемента данных (возможно, целочисленный тип), поэтому, если тип == 1 делает существующий объект. else, если тип == 2 делает объект to_be_extended_helper.

  • 0
    Спасибо Али, но проблема в том, что вы не знаете, какой тип ввода может быть до запуска и, следовательно, выше не будет работать. Я знаю, что лучший выбор - сделать их полиморфными, но в моем случае это приведет к значительному рефакторингу кода, поэтому я хотел найти обходной путь, если это возможно.
  • 0
    во время выполнения, как вы определяете тип, скажем, на основе пользовательского ввода вы создаете объект в бесплатном хранилище, верно? Вы также можете создать соответствующий тип объекта на основе пользовательского ввода, просто попросите пользователя также ввести его тип.
0

сделайте to_be_extend extend существующим и добавьте флаг.

struct existing
{
    int a, b;
    bool isBase;
    existing():isBase(true){}
}
struct to_be_extended : public existing
{
    int c;
    to_be_extended():isBase(false){}
}
func(existing& e)
{
    if(e.isBase)
        ...
    else
        ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню