LINUX.ORG.RU

Qt и g++: Не компилируется класс с абстрактным методом


0

0

Qt - снапшот недельной давности, собирал с конфигом:

./configure -prefix /usr/trolltech/QtEmbedded-4.5.0s-x86 -qvfb -no-largefile -no-qt3support -little-endian -depths 8,16

g++ --version

g++ (Debian 4.3.3-3) 4.3.3

basicwidget.h:

#ifndef BASICWDG_H

#define BASICWDG_H

#include <QWidget>

class BasicWdg : public QWidget

{

Q_OBJECT

private:

protected:

virtual void MatchButtons(void)=0;

public:

BasicWdg(QWidget *parent = 0, Qt::WindowFlags f = 0);

};

#endif // BASICWDG_H

basicwidget.cpp:

#include "misc.h"

#include "basicwidget.h"

#include "fmain.h"

BasicWdg::BasicWdg(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)

{

setGeometry(CENTRAL_WIDGET_LEFT, CENTRAL_WIDGET_TOP, CENTRAL_WIDGET_WIDTH, CENTRAL_WIDGET_HEIGHT);

setAutoFillBackground(true);

mainWnd->DisconnectAllSignals();

MatchButtons();

}

Компилятор пишет:

src/basicwidget.cpp|11|undefined reference to `BasicWdg::MatchButtons()'


убери вызов MatchButtons();

lester ★★★★
()

class A;
class B : public A;
class C : public B
{
      virtual f () = 0;
}
class D 
{
      f ()
      {
      }
}

Конструирование объекта D
allocate memory -> constructor A -> constructor B -> constructor C ( virtual table f = 'pure virtual call handler' -> constructor D ( virtual table f = D::f )

Итого в худшем случае это будет exception, в лучшем не скомпилится. compiler depended.


Выход: Делать доп функцию для инициализации после конструирования объекта

Итого:

бред
D::D()
{
    f();
}

норм
D * d = new D;
if (d->Init())

mumg
()
Ответ на: комментарий от devinull

В данном случае -

10.4.6

Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making
a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or
destroyed) from such a constructor (or destructor) is undefined.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

>в конструкторе виртуальные функции работать не будут.

Надо сделать дополнение, абстрактные методы ДАННОГО класса.
Абстрактные методы родителей могут быть вызваны если они были переопределены. На этапе вызова конструктора таблица виртуальных методов уже будет переопределена.

mumg
()
Ответ на: комментарий от alex_custov

>В данном случае

А, это меняет дело. Даже логично )

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.