Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросец по ООП 
V
    Опции темы
XanderEVG
Дата 16.4.2015, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.4.2011

Репутация: нет
Всего: нет



Здравствуйте. не могу понять следующий момент: имею 2 класса
Код

class XlsReader: 
{

public:
    XlsReader(QString file);
    ~XlsReader();

    bool openXL(QString file);                                       // !
    QVariant readCell(quint32 row, quint32 col);          // !

    QPoint findText(QString text);
    void closeFile();
    // и т д

};

и
Код

class XlsXReader: 
{

public:
    XlsXReader(QString file);
    ~XlsXReader();

    bool openXL(QString file);                                       // !
    QVariant readCell(quint32 row, quint32 col);          // !

    QPoint findText(QString text);
    void closeFile();
    // и т д

};


при этом реализация всех методов(их много) одинаковая, за исключением openXL и readCell. Как можно написать что бы не дублировать код? //пожалуйста сильно не пинайте, че то туплю не могу сообразить, спасибо ))
PM MAIL   Вверх
feodorv
Дата 16.4.2015, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Виртуальные функции + наследование не подойдут?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
XanderEVG
Дата 17.4.2015, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.4.2011

Репутация: нет
Всего: нет



я так и хотел. базовый класс реализует все общие функции, а наследники только openXL и readCell. т е:
Код

class Base: 
{
public:
    XlsReader(QString file);
    ~XlsReader();

    virtual  bool openXL(QString file)=0;                                     // !
    virtualQVariant readCell(quint32 row, quint32 col)=0;          // !

    QPoint findText(QString text);
    void closeFile();
    // и т д
};

QPoint Base::findText(QString text)
{
    if(readCell(5,1) == text)  //здесь нужно выполнить метод наследника, а пытается выполнится метод класса Base
            return QPoint(5,1)

    return QPoint(-1,-1)
}



но похоже проблема в том, что я нифига не понимаю как использовать наследование(((
PM MAIL   Вверх
feodorv
Дата 17.4.2015, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(XanderEVG @  17.4.2015,  06:35 Найти цитируемый пост)
//здесь нужно выполнить метод наследника

А где код наследника-то?

Я так думаю:
Код

class XlsReader
{
  public:
    XlsReader(QString file);
    ...
    virtual bool openXL(QString file);
    virtual QVariant readCell(quint32 row, quint32 col); 
    ...
};

bool XlsReader::openXL(QString file)
{
    ...
}

QVariant XlsReader::readCell(quint32 row, quint32 col)
{
    ...
}

class XlsXReader : public XlsReader
{
  public:
    XlsXReader(QString file) : XlsReader(file) {}
    ...
    virtual bool openXL(QString file);
    virtual QVariant readCell(quint32 row, quint32 col);
    ...
};

bool XlsXReader::openXL(QString file)
{
    ...
}

QVariant XlsXReader::readCell(quint32 row, quint32 col)
{
    ...
}

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
XanderEVG
Дата 17.4.2015, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.4.2011

Репутация: нет
Всего: нет



Спасибо, вопрос решен.
оказалось все просто.

методы которые вызываются из конструктора базового класса являются методами этого класса. но если вызывать метод (но не конструктор ) через указатель на класс-наследник, то все работает как нужно.
Код

class Base: 
{
public:
    Base();
    virtual viod read();
    void read_all();
};

Base()
{
     read_all()
}
 viod read()
{
qDebug()<<"Base";
}
   
 void read_all()
{
   read();
   read();
}



если создать наследника и переопределить read() на qDebug()<<"Child";

то создав обьект выведет :
"Base"
"Base".

а если вызвать child.read_all():
"Child"
"Child"
PM MAIL   Вверх
borisbn
Дата 17.4.2015, 19:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(XanderEVG @  17.4.2015,  17:09 Найти цитируемый пост)
методы которые вызываются из конструктора базового класса являются методами этого класса

Я был дико удивлён, когда узнал, что это не так в C++ Builder'е, причём только для классов-наследников TObject. Для остальных (обычных) классов Builder вёл себя как и положено: в конструкторе - свои функции, в других функциях - наследника (вернее, по виртуальной таблице).


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.