виртуальное копирование и оптимизация
От: Аноним  
Дата: 01.03.07 08:47
Оценка:
Скажем есть во такое:

struct Node {};
class BaseSource {
public:
  virtual ~BaseSource() {}
  virtual bool getNode(size_t idx, Node& node) = 0;
  virtual bool addNode(const Node& node) = 0;
  size_t size() const { return size_; }
protected:
  size_t size_;
};

class MemSource : public BaseSource {
//code
};

class FileSource : public BaseSource {
//code
};


интерфейс BaseSource использовался чтобы показывать содержимое
внезависимости от источника.

Но возникла проблема надо BaseSource копировать один в другой,
вернее
MemSource -> FileSource
FileSource -> FileSource

Можно сделать это опираясь на интерфейс BaseSource,
но это хоть и дешево относительн кода и красиво на мой взгляд,

не нравиться пользователю, т.к. в случае
FileSource->FileSource
занимает кучу времени: Node храняться на диске в упакованном виде,
и вместо распоковка -> перегон в буфер -> запаковка,
можно просто скопировать файл.

Как наиболее правильно реализовать на C++?

virtual BaseSource& operator=(const BaseSource&) ?

или виртуальный operator= лучше не определять и сделать метод copy?

использовать dynamic_cast в FileSource и выполнять оптимизированную версию
если не NULL или есть другие способы?
Re: виртуальное копирование и оптимизация
От: jazzer Россия Skype: enerjazzer
Дата: 01.03.07 08:50
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Как наиболее правильно реализовать на C++?


Тут тебе помогут мультиметоды.
Например, в виде двойной диспетчеризации.
Дальше — поиск в руки
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[2]: виртуальное копирование и оптимизация
От: Аноним  
Дата: 01.03.07 09:02
Оценка:
Здравствуйте, jazzer, Вы писали:

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



А>>Как наиболее правильно реализовать на C++?


J>Тут тебе помогут мультиметоды.

J>Например, в виде двойной диспетчеризации.
J>Дальше — поиск в руки

мультиметоды я нашел:
http://www.rsdn.ru/Forum/Message.aspx?mid=51828#51828
Автор: Павел Кузнецов
Дата: 06.05.02


спасибо.

а как насчет operator= стоит ли его делать виртуальным,
или лучше не заниматься переопределением операций,
а написать метод с имененм?
Re[3]: виртуальное копирование и оптимизация
От: jazzer Россия Skype: enerjazzer
Дата: 01.03.07 09:18
Оценка:
Здравствуйте, Аноним, Вы писали:

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


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



А>>>Как наиболее правильно реализовать на C++?


J>>Тут тебе помогут мультиметоды.

J>>Например, в виде двойной диспетчеризации.
J>>Дальше — поиск в руки

А>мультиметоды я нашел:

А>http://www.rsdn.ru/Forum/Message.aspx?mid=51828#51828
Автор: Павел Кузнецов
Дата: 06.05.02


А>спасибо.


А>а как насчет operator= стоит ли его делать виртуальным,

А>или лучше не заниматься переопределением операций,
А>а написать метод с имененм?

Можно и то, и другое.
Например, предоставить перегруженную виртуальную функцию типа copy_to с разными аргументами, и звать ее из operator=
типа такого:
class MemSource : public BaseSource {
MemSource & operator=(const BaseSource& rhs) { rhs.copy_to(*this); return *this; }

void copy_to(MemSource& m) {.....}
void copy_to(FileSource & f) {.....}
};

class FileSource : public BaseSource {
FileSource & operator=(const BaseSource& rhs) { rhs.copy_to(*this); return *this; }

void copy_to(MemSource& m) {.....}
void copy_to(FileSource & f) {.....}
};

все виртуальное, естественно
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: виртуальное копирование и оптимизация
От: Vadim S. Беларусь  
Дата: 02.03.07 12:17
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>virtual BaseSource& operator=(const BaseSource&) ?


если вы определите вирутальный оператор присваивания, то вам придется переопределять его в каждом наследнике (то есть, базовый алгоритм не возможно будет использовать без явного оверрайда), ибо

The assignment operator (=) is, strictly speaking, a binary operator. Its declaration is identical to any other binary operator, with the following exceptions:

It must be a nonstatic member function. No operator= can be declared as a nonmember function.
It is not inherited by derived classes.

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