перегрузка
От: Аноним  
Дата: 05.07.11 08:43
Оценка:
Есть структура:

struct Foo
{
  int a;
  uint b;
};

Она передается какому-нибудь внешнему модулю с помощью функции

void boo(Foo* foo, uint foo_size);


В зависимости от версии интерфейса структура должна меняться, например

  // Ver = 0
struct Foo_v0
{
  int a;
  uint b;
};
  // Ver = 1
struct Foo_v1
{
  int a;
  uint b;
  uint c;
};


Перегружать функцию нельзя. Сделал так:

class Foo {};

class Foo_v0 : public Foo
{
public:
   int a;
   uint b;
};

class Foo_v1 : public Foo
{
public:
   int a;
   uint b;
   uint c;
};


Собственно работает, но хочется узнать побольше вариантов для решения подобного.
Re: перегрузка
От: boot  
Дата: 05.07.11 08:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Собственно работает, но хочется узнать побольше вариантов для решения подобного.


class Foo
{
public:
   int a;
   uint b;
};

class Foo_v0 : public Foo
{
};

class Foo_v1 : public Foo
{
public:
   uint c;
;


Других вариантов много. Все зависит от контекста.
Жизнеспособность прямо пропорциональна простоте!
Re[2]: перегрузка
От: Аноним  
Дата: 05.07.11 09:10
Оценка:
Здравствуйте, boot, Вы писали:

B>Других вариантов много. Все зависит от контекста.


У меня есть приложение, которое работает с N-ым количеством библиотек. В связи с дополнением в интерфейсе обмена (в примере добавились новые члены структуры Foo) с этими библиотеками появилась вышеописанная задачка: нужно сохранить вид функции, экспортируемой из библиотеки (void boo(Foo*, uint)), но и обеспечить поддержку в приложении разных версий структуры Foo (версию интерфейса от библиотеки я могу получить). То есть фактически нужно перегрузить тип Foo под разные версии. Как-то так.
Re[3]: перегрузка
От: boot  
Дата: 05.07.11 09:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня есть приложение, которое работает с N-ым количеством библиотек. В связи с дополнением в интерфейсе обмена (в примере добавились новые члены структуры Foo) с этими библиотеками появилась вышеописанная задачка: нужно сохранить вид функции, экспортируемой из библиотеки (void boo(Foo*, uint)), но и обеспечить поддержку в приложении разных версий структуры Foo (версию интерфейса от библиотеки я могу получить). То есть фактически нужно перегрузить тип Foo под разные версии. Как-то так.


Ну это уже что-то с чем-то. А то первая формуликовка была похожа на фразу "что мне одеть, если на мне нет белья".
Но ведь сущность Foo меняется, а функция работающая с ней остается прежней. Что функция будет делать с измененной сущностью, когда она думает что Foo осталась прежней?
Жизнеспособность прямо пропорциональна простоте!
Re[4]: перегрузка
От: Аноним  
Дата: 05.07.11 09:53
Оценка:
Здравствуйте, boot, Вы писали:

B>Ну это уже что-то с чем-то. А то первая формуликовка была похожа на фразу "что мне одеть, если на мне нет белья".

B>Но ведь сущность Foo меняется, а функция работающая с ней остается прежней. Что функция будет делать с измененной сущностью, когда она думает что Foo осталась прежней?

Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo.
Я сам из приложения контролирую указатель на структуру какого типа (версии) передать функции. Если вдруг у меня рука дрогнет и я запульну библиотеке совершенно незнакомую ей структуру, то получу ошибку несоответствия размера структуры (тут прошу прощения в примере функция возвращает int, а не void).

int boo(Foo* foo, uint foo_size);
// вызов
Foo_v0 foo;
res = boo(&foo, sizeof(foo));


То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.
Re[5]: перегрузка
От: boot  
Дата: 05.07.11 10:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo.

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

А>
А>int boo(Foo* foo, uint foo_size);
А>// вызов
А>Foo_v0 foo;
А>res = boo(&foo, sizeof(foo));
А>


А>То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.


Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.
Жизнеспособность прямо пропорциональна простоте!
Re[6]: перегрузка
От: Аноним  
Дата: 05.07.11 10:39
Оценка:
Здравствуйте, boot, Вы писали:

B>Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.


Да я воспользовался вашим решением, согласен оно более корректно. Я просто думал может в данной задаче правильнее как-то шаблоны заюзать, с другой стороны наследование само напрашивается.
Re: перегрузка
От: Kolobrodin Россия  
Дата: 05.07.11 11:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть структура:


А>
А>struct Foo
А>{
А>  int a;
А>  uint b;
А>};
А>

А>Она передается какому-нибудь внешнему модулю с помощью функции

А>
А>void boo(Foo* foo, uint foo_size);
А>


А>В зависимости от версии интерфейса структура должна меняться, например

А>Перегружать функцию нельзя. Сделал так:

А>Собственно работает, но хочется узнать побольше вариантов для решения подобного.


Копнуть в сторону интерфейсов и основ COM.

Тогда:

class IFoo
{
   IFoo* queryInterface(char const*);
};

class Foo : public IFoo
{
   IFoo* queryInterface(char const* name)
   {
       return strcmp(name, "Foo") ? NULL : this;
   }
};

class Foo2 : public IFoo
{
   IFoo* queryInterface(char const* name)
   {
       return strcmp(name, "Foo.2") ? NULL : this;
   }
};


void boo(IFoo* foo)
{
    if (IFoo* f = foo.queryInterface("Foo"))
    {
        // do something        
    }
    else if (IFoo* f = foo.queryInterface("Foo.2"))
    {
        // do something
    }
    else
    { 
         throw std::runtime_error("The interface is not supported.");
    }
}
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[7]: перегрузка
От: boot  
Дата: 05.07.11 13:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я просто думал может в данной задаче правильнее как-то шаблоны заюзать, с другой стороны наследование само напрашивается.


Можно, но от этих мучений может помочь анекдотик.

Глубоко в отладке сидит папа-программист. К нему подходит сын и спрашивает:
-- Пап, а почему солнце каждый день всходит и заходит?
Папа пытается прояснить ситуацию и спрашивает:
-- Каждый день всходит и заходит?... Ты проверял? Точно каждый день?
Сын:
-- Да, точно!
Папа:
-- Ну, если каждый день всходит и каждый день заходит... Ничего не трогай, ничего не меняй!
Жизнеспособность прямо пропорциональна простоте!
Re[8]: перегрузка
От: Аноним  
Дата: 06.07.11 11:32
Оценка:
Здравствуйте, boot, Вы писали:

B>Можно, но от этих мучений может помочь анекдотик.


B>Глубоко в отладке сидит папа-программист. К нему подходит сын и спрашивает:

B>-- Пап, а почему солнце каждый день всходит и заходит?
B>Папа пытается прояснить ситуацию и спрашивает:
B>-- Каждый день всходит и заходит?... Ты проверял? Точно каждый день?
B>Сын:
B>-- Да, точно!
B>Папа:
B>-- Ну, если каждый день всходит и каждый день заходит... Ничего не трогай, ничего не меняй!

Согласен, порой в погоне за прекрасным теряешь основной функционал
Re[6]: перегрузка
От: dimchick Украина  
Дата: 14.07.11 15:14
Оценка:
Здравствуйте, boot, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo.

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

А>>
А>>int boo(Foo* foo, uint foo_size);
А>>// вызов
А>>Foo_v0 foo;
А>>res = boo(&foo, sizeof(foo));
А>>


А>>То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.


B>Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.


WinAPI написан на С. В C нет наследования.
Re[7]: перегрузка
От: boot  
Дата: 14.07.11 15:19
Оценка:
Здравствуйте, dimchick, Вы писали:

D>Здравствуйте, boot, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:


А>>>Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo.

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

А>>>
А>>>int boo(Foo* foo, uint foo_size);
А>>>// вызов
А>>>Foo_v0 foo;
А>>>res = boo(&foo, sizeof(foo));
А>>>


А>>>То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.


B>>Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.


D>WinAPI написан на С. В C нет наследования.


Да я и не писал про наследование, прочитайте внимательней, это автор топика на нем настаивает, а я пытаюсь его отговорить.
А насчет наследования в Си, не буду с Вами спорить
Жизнеспособность прямо пропорциональна простоте!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.