У меня есть сценарий, в котором функция принимает структуру (существующую, существующую), которая является только держателем данных. но функция, которая обрабатывает эти данные, тесно связана с этими данными. Теперь мне нужно обрабатывать дополнительные данные, для которых необходимо расширить структуры (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.
*/
}
Перегрузите функцию для разных типов аргументов:
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);
}
Сделайте их полиморфным первым выбором. Если его не требуется, добавьте тип элемента данных (возможно, целочисленный тип), поэтому, если тип == 1 делает существующий объект. else, если тип == 2 делает объект to_be_extended_helper.
сделайте 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
...
}
if(type == existing) ... else ...
Это очень распространенный шаблон. Эта модель является причиной, по которой объектно-ориентированное программирование, известное как полиморфизм на основе наследования, было изобретено еще в 1960-х годах. Если вы не хотите повторно использовать идею ООП, вы, вероятно, в итоге плохо ее изобретаете.