الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه محمد عودة في 8 مايو 2012 · 3 رد · 1,650 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

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

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

الكود:

#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'

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

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#2

اولا ان كنت تستخدم الـ 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 سيجبرك على ربطه من داخل الفئة فقط

تحياتي

المرفقات
1.jpg2.jpg4.jpg

تم تعديل هذه المشاركة بواسطة ihope في 9 مايو 2012 في 09:22

1

other ESTJ thing

اقتباس
Help Me To Help You

0xBAD00DAD.png

#3

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

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

1

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#4

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

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

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

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

بالتوفيق ،

تم تعديل هذه المشاركة بواسطة SudaNix في 8 مايو 2012 في 19:42

3

مواضيع مشابهة