Интерфейс операций с памятью (ищу пример)
От: assm-spb Россия  
Дата: 09.04.13 23:24
Оценка:
Здравствуйте!
Есть два класса 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. И то и другое – громоздко. Может быть, кто-нибудь подскажет хороший пример интерфейса операций (манипуляции) с памятью?! Или, опираясь на свой опыт подскажет, как бы надо поступить?
Спасибо.
Re: Интерфейс операций с памятью (ищу пример)
От: jazzer Россия Skype: enerjazzer
Дата: 10.04.13 01:56
Оценка:
Здравствуйте, 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
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Интерфейс операций с памятью (ищу пример)
От: saf_e  
Дата: 10.04.13 09:18
Оценка:
Здравствуйте, 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 которые сами будут либо просто вставлять/заменять либо конвертировать тип по необходимости. Если нужна типо-безопасность, заставляйте явно его указывать.

Как-то так
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.