• 0
AudaNix

مشكلة undefined reference to `vtable for اثناء ترجمة كود فى Qt Creator

سؤال

السلام عليكم ورحمة الله وبركاتة .

اليوم وددت أن أختبر المهارات التى تعلمناها فى السي ++ وهى عمل الفئات والوراثة وغيرها من اﻻشياء الجميلة.

أحضرت قلم وكراس وأخترت شاشة أحد مخرجات الدروس وقمت بالعمل عليها

وبالفعل كتبت الكود وراجعتة أكثر من مرة لدرجتة أننى طابقتة مع التمرين لكن ﻻ جدوى يظهر الخطأ وقت الترجمة

الكود:

#include <QWidget>
#include <QApplication>
#include <QPushButton>
#include <QLabel>

class mybutton:public QWidget
{
Q_OBJECT

public:
mybutton(QWidget *parent = 0);

private slots:
void onminus();
void onplus();

private:
QLabel *label;
};


mybutton::mybutton(QWidget *parent):QWidget(parent)
{
QPushButton *minus = new QPushButton("-", this);
minus->setGeometry(30,50,50,50);

QPushButton *plus = new QPushButton("+", this);
plus->setGeometry(30,100,50,50);
label = new QLabel("0", this);
label->setGeometry(100,50,50,75);
QPushButton *quite = new QPushButton("quite", this);
quite->setGeometry(30,150,50,75);
connect(quite, SIGNAL(clicked()),qApp, SLOT(quit()));
connect(minus, SIGNAL(clicked()),this, SLOT(onminus()));
connect(plus, SIGNAL(clicked()),this, SLOT(onplus()));
}
void mybutton::onminus()
{
int i = label->text().toInt();
--i;
label->setText(QString::number(i));
}
void mybutton::onplus()
{
int i = label->text().toInt();
++i;
label->setText(QString::number(i));
}

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
mybutton newcmd;
newcmd.show();
return a.exec();
}

مخرجات المترجم:

11:20:33: Running build steps for project commm...
11:20:33: Configuration unchanged, skipping qmake step.
11:20:33: Starting: "/usr/bin/make" -w
make: Entering directory `/home/caster/QtSDK/commm-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release'
/home/caster/QtSDK/Desktop/Qt/4.8.0/gcc/bin/qmake -spec ../Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -o Makefile ../commm/commm.pro
make: Leaving directory `/home/caster/QtSDK/commm-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release'
make: Entering directory `/home/caster/QtSDK/commm-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release'
g++ -Wl,-O1 -Wl,-rpath,/home/caster/QtSDK/Desktop/Qt/4.8.0/gcc/lib -o commm main.o -L/home/caster/QtSDK/Desktop/Qt/4.8.0/gcc/lib -lQtGui -lQtCore -lpthread
main.o: In function `mybutton::mybutton(QWidget*)':
make: Leaving directory `/home/caster/QtSDK/commm-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release'
main.cpp:(.text+0x56): undefined reference to `vtable for mybutton'
main.cpp:(.text+0x5d): undefined reference to `vtable for mybutton'
main.o: In function `main':
main.cpp:(.text.startup+0x5f): undefined reference to `vtable for mybutton'
main.cpp:(.text.startup+0x67): undefined reference to `vtable for mybutton'
main.cpp:(.text.startup+0xa2): undefined reference to `vtable for mybutton'
main.o:main.cpp:(.text.startup+0xaa): more undefined references to `vtable for mybutton' follow
collect2: ld returned 1 exit status
make: *** [commm] Error 1
11:20:33: The process "/usr/bin/make" exited with code 2.
Error while building project commm (target: Desktop)
When executing build step 'Make'

حاولت وسأحاول جاهدا ﻷيجاد حل واتمنى أن تساعدونى فى توضيح اسباب المشكلة وجزاكم الله خير.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0

اولا ان كنت تستخدم الـ Qt Creator

لن تحتاج الى هذا الحل اذا اتبعت الاتي

الحل السهل

post-20735-099096600 1336476915_thumb.jp

post-20735-057044900 1336476931_thumb.jp

post-20735-007121400 1336476947_thumb.jp

وضع تعريف الفئة class definition في mybutton.h

و الـ class Implementation في mybutton.cpp

الحل المضني Do It Your-self

فقط افصل تعريف الفئة - class defintion في ملف منفصل

وليكن اسمه mybutton.h

واضفه في ملف المشروع myProject.pro

HEADERS  += mybutton.h 

في الملف mybutton.h

ضع في أوله السطرين


#ifndef MYBUTTON_H
#define MYBUTTON_H

وفي اخره


#endif // MYBUTTON_H

ليكون هكذا


#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QWidget>
#include <QWidget>
#include <QApplication>
#include <QPushButton>
#include <QLabel>

class mybutton:public QWidget
{
Q_OBJECT

public:
mybutton(QWidget *parent = 0);

private slots:
void onminus();
void onplus();

private:
QLabel *label;
};

#endif // MYBUTTON_H

واضف السطر في بداية ملف main

#include"mybutton.h"

مع ان التالي ليس من الحل لكنه قد يفيدك

في تعريف الفئة كتبت

 private slots:

السلوت لا يعرف الا محمي protected أو عام public

و تعريفه بخاص private سيجبرك على ربطه من داخل الفئة فقط

تحياتي

تم تعديل بواسطه ihope
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

+1 رد أكثر من رائع ما شاء الله.

أخى لماذا تفعل ذلك كيوتو هل لديك تفسير لذلك؟

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

قم بفصل تعريف الفئة mybutton الى ملف منفصل ، وليكن تعريف الفئة في .h وتعريف الدوال الخاصة بها في .cpp.

والسبب ان الفئة التي قمت بكتابتها تستخدم الماكرو Q_OBJECT، signals, slots، وهذا الماكرو يقوم بالتعامل معه مترجم داخلي في كيوت يسمى Meta Object Compiler (moc) .

المخرجات من moc هو ملف سي++ تحمل نفس اسم ملف الرأس وتنتهي ب _moc.cpp.

كحل اخر هو تضمين ملف moc مباشرة ، لكن الحل الاول هو الأفضل بكل تأكيد.

بالتوفيق ،

تم تعديل بواسطه SudaNix
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .