Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Клонирование

Автор: ruzik 25.3.2012, 21:57

Здравствуйте, нужно переопределить функцию клонирования в наследнике QStandardItem с учетом нового члена класса
Вот что получилось у меня:

#ifndef RDATAITEM_H
#define RDATAITEM_H
//--------Qt
#include "QStandardItem"
//-------My and other headers
#include "Classes/RDataItemModel/RDataItemModel.h"
//-------
class RDataItemModel;

class RDataItem : public QStandardItem
{
public:
//***********/
    void setItemType(const RDataItemModel::itemType tp) { type = tp; }
    RDataItemModel::itemType getItemType() const { return type; }

     QStandardItem *clone() const;
     void setValue(const RDataItem * item) { *this = *item; }
private:
    RDataItemModel::itemType type;
};

#endif

//-------My and other headers
#include "RDataItem.h"
//-------

QStandardItem *RDataItem::clone() const
{
    RDataItem *item = new RDataItem(text());
    item->setValue(this);
    item->setItemType(getItemType());

    return item;
}

Нельзя ли как-то более понятно и красиво реализовать это дело, а то согласитесь, использовать для этого отдельную функцию, которую пришлось сделать публичной не есть правильно
Заранее спасибо!

Автор: wiz29 26.3.2012, 8:54

такая стратегия имеет место быть, и дело тут не в "некрасивости". При разных объектных моделях используют разные подходы. Можно переопределить конструктор копирования или создать фабрику клонирования, это уже зависит от конкретной задачи. Но, обычно, клонирующая функция является виртуальной. Можно посмотреть http://progbook.ru/2008/08/03/sovremennoe-proektirovanie-na-c-andrejj.html различные подходы к решению твоей проблемы более детально.

Автор: ruzik 26.3.2012, 10:15

Цитата
Но, обычно, клонирующая функция является виртуальной.

Она и в данном случае ей является :)
Буду смотреть, спасибо за помощь!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)