Здравствуйте!
Есть два класса DataType1 и DataType2, каждый из которых инкапсулирует указатель памяти на данные своего типа. У класса DataType1 есть, например, функция:
void DataType1::ConvertRangeToType2(DataType2& Destination, int nDestPos, int nSourcePos, int nLength) {...}
Проблема в том, что код, вызывающий эту функцию класса практически не читабельный:
DataType1 ds(100); //100 элементов типа 1
DataType2 dd(1000); //1000 элементов типа 2
//Догадаться, какой аргумент за что отвечает – невозможно без просмотра прототипа
Ds.ConvertRangeToType2(dd, 200, 0, 100);
Как следствие – высока вероятность допустить ошибку. Оформить все, чтобы можно было писать в стиле C# так:
ds.GetRange(0, 100).ConvertToType2(dd.GetRange(200, 100))
не выйдет, так как не получиться вернуть ссылки, созданные в вызываемых функциях. Если добавить манипулятор и перейти к указателям – их надо сохранять, чтобы затем удалить, либо использовать auto_ptr. И то и другое – громоздко. Может быть, кто-нибудь подскажет хороший пример интерфейса операций (манипуляции) с памятью?! Или, опираясь на свой опыт подскажет, как бы надо поступить?
Спасибо.
Здравствуйте, assm-spb, Вы писали:
AS>AS>DataType1 ds(100); //100 элементов типа 1
AS>DataType2 dd(1000); //1000 элементов типа 2
AS>//Догадаться, какой аргумент за что отвечает – невозможно без просмотра прототипа
AS>Ds.ConvertRangeToType2(dd, 200, 0, 100);
AS>
AS>не выйдет, так как не получиться вернуть ссылки, созданные в вызываемых функциях. Если добавить манипулятор и перейти к указателям – их надо сохранять, чтобы затем удалить, либо использовать auto_ptr. И то и другое – громоздко. Может быть, кто-нибудь подскажет хороший пример интерфейса операций (манипуляции) с памятью?! Или, опираясь на свой опыт подскажет, как бы надо поступить?
Как насчет протокола STL?
Я правильно понимаю, что тебе надо скопировать данные из
ds в
dd на 200 позиции?
Если
ds и
dd поддерживают интерфейс STL, то код будет выглядеть вот так:
std::copy( ds.begin(), ds.end(), dd.begin()+200 );
Тут будет использоваться присваивание, т.е. предполагается, что переменной типа 2 можно присвоить переменную типа 1.
Если такого присваивания нет, но есть функция/функтор для конвертирования
convert, то используй
std::transform:
std::transform( ds.begin(), ds.end(), dd.begin()+200, convert );
ЗЫ Алгоритмы Boost.Range идут еще дальше, там достаточно будет просто написать
ds вместо
ds.begin(), ds.end().
http://www.boost.org/libs/range/doc/html/range/reference/algorithms/mutating/copy.html
http://www.boost.org/libs/range/doc/html/range/reference/algorithms/mutating/transform.html
Здравствуйте, assm-spb, Вы писали:
AS>Здравствуйте!
AS>Есть два класса DataType1 и DataType2, каждый из которых инкапсулирует указатель памяти на данные своего типа. У класса DataType1 есть, например, функция:
AS>AS>void DataType1::ConvertRangeToType2(DataType2& Destination, int nDestPos, int nSourcePos, int nLength) {...}
AS>
AS>Проблема в том, что код, вызывающий эту функцию класса практически не читабельный:
AS>AS>DataType1 ds(100); //100 элементов типа 1
AS>DataType2 dd(1000); //1000 элементов типа 2
AS>//Догадаться, какой аргумент за что отвечает – невозможно без просмотра прототипа
AS>Ds.ConvertRangeToType2(dd, 200, 0, 100);
AS>
AS>Как следствие – высока вероятность допустить ошибку. Оформить все, чтобы можно было писать в стиле C# так:
AS>AS>ds.GetRange(0, 100).ConvertToType2(dd.GetRange(200, 100))
AS>
AS>не выйдет, так как не получиться вернуть ссылки, созданные в вызываемых функциях. Если добавить манипулятор и перейти к указателям – их надо сохранять, чтобы затем удалить, либо использовать auto_ptr. И то и другое – громоздко. Может быть, кто-нибудь подскажет хороший пример интерфейса операций (манипуляции) с памятью?! Или, опираясь на свой опыт подскажет, как бы надо поступить?
AS>Спасибо.
Про STL-like интерфейс вам уже рассказали.
Добавьте итераторы: begin, end. Уберите от пользователя лишние знания о конверте и прочем.
Заводите ф-ции типа: insert/replace которые сами будут либо просто вставлять/заменять либо конвертировать тип по необходимости. Если нужна типо-безопасность, заставляйте явно его указывать.
Как-то так