Скажем есть во такое:
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 или есть другие способы?
Здравствуйте, Аноним, Вы писали:
А>Как наиболее правильно реализовать на C++?
Тут тебе помогут мультиметоды.
Например, в виде двойной диспетчеризации.
Дальше — поиск в руки
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>Как наиболее правильно реализовать на C++?
J>Тут тебе помогут мультиметоды.
J>Например, в виде двойной диспетчеризации.
J>Дальше — поиск в руки
мультиметоды я нашел:
http://www.rsdn.ru/Forum/Message.aspx?mid=51828#51828Автор: Павел Кузнецов
Дата: 06.05.02
спасибо.
а как насчет operator= стоит ли его делать виртуальным,
или лучше не заниматься переопределением операций,
а написать метод с имененм?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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) {.....}
};
все виртуальное, естественно