Здравствуйте, Аноним, Вы писали:
А>Собственно работает, но хочется узнать побольше вариантов для решения подобного.
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 под разные версии. Как-то так.
Здравствуйте, Аноним, Вы писали:
А>У меня есть приложение, которое работает с 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));
То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.
Здравствуйте, Аноним, Вы писали:
А>Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo. А>Я сам из приложения контролирую указатель на структуру какого типа (версии) передать функции. Если вдруг у меня рука дрогнет и я запульну библиотеке совершенно незнакомую ей структуру, то получу ошибку несоответствия размера структуры (тут прошу прощения в примере функция возвращает int, а не void).
А>
А>То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.
Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.
Жизнеспособность прямо пропорциональна простоте!
Re[6]: перегрузка
От:
Аноним
Дата:
05.07.11 10:39
Оценка:
Здравствуйте, boot, Вы писали:
B>Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.
Да я воспользовался вашим решением, согласен оно более корректно. Я просто думал может в данной задаче правильнее как-то шаблоны заюзать, с другой стороны наследование само напрашивается.
Здравствуйте, Аноним, Вы писали:
А>Есть структура:
А>
А>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[8]: перегрузка
От:
Аноним
Дата:
06.07.11 11:32
Оценка:
Здравствуйте, boot, Вы писали:
B>Можно, но от этих мучений может помочь анекдотик.
B>Глубоко в отладке сидит папа-программист. К нему подходит сын и спрашивает: B>-- Пап, а почему солнце каждый день всходит и заходит? B>Папа пытается прояснить ситуацию и спрашивает: B>-- Каждый день всходит и заходит?... Ты проверял? Точно каждый день? B>Сын: B>-- Да, точно! B>Папа: B>-- Ну, если каждый день всходит и каждый день заходит... Ничего не трогай, ничего не меняй!
Согласен, порой в погоне за прекрасным теряешь основной функционал
Здравствуйте, boot, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo. А>>Я сам из приложения контролирую указатель на структуру какого типа (версии) передать функции. Если вдруг у меня рука дрогнет и я запульну библиотеке совершенно незнакомую ей структуру, то получу ошибку несоответствия размера структуры (тут прошу прощения в примере функция возвращает int, а не void).
А>>
А>>То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.
B>Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.
Здравствуйте, dimchick, Вы писали:
D>Здравствуйте, boot, Вы писали:
B>>Здравствуйте, Аноним, Вы писали:
А>>>Немного поподробней про функцию библиотеки: приложение хочет получить от текущей библиотеки некие конфигурационные данные. Т.е. вся задача функции — тупое копирование "из библиотеки в приложение" структуры Foo. А>>>Я сам из приложения контролирую указатель на структуру какого типа (версии) передать функции. Если вдруг у меня рука дрогнет и я запульну библиотеке совершенно незнакомую ей структуру, то получу ошибку несоответствия размера структуры (тут прошу прощения в примере функция возвращает int, а не void).
А>>>
А>>>То есть вопрос имеет чисто технический характер. Решение с наследованием работает, но просто хочется узнать может быть более красивое решение.
B>>Мне думается, было бы лучше не менять структуру Foo, а встраивать ее в неизменном виде в другие структуры. Во всяком случае такой подход всегда применялся в WinAPI. И меньше будет ошибок.
D>WinAPI написан на С. В C нет наследования.
Да я и не писал про наследование, прочитайте внимательней, это автор топика на нем настаивает, а я пытаюсь его отговорить.
А насчет наследования в Си, не буду с Вами спорить