在下面的代码中,Base_Dialog有一个名为name of QString *的变量。
#ifndef BASE_DIALOG_HPP
#define BASE_DIALOG_HPP
#include <QDialog>
#include <QString>
class Main_Dialog;
class Base_Dialog:public QDialog
{
protected:
Main_Dialog* main_dlg_;
QDialog* caller_;
QString* name;//<--- Here is this variable
public:
Base_Dialog(QString n,Main_Dialog* main_dlg, QDialog* caller, QWidget *parent = nullptr);
QDialog* set_caller(QDialog *);
QDialog* clear_caller();
Main_Dialog* clear_main_dlg();
};
#endif // BASE_DIALOG_HPP
//cpp for Base_Dialog
Base_Dialog::Base_Dialog(QString n,Main_Dialog* main_dlg, QDialog*caller, QWidget *parent):
QDialog(parent),
main_dlg_(main_dlg),
caller_(caller),
name(new QString(n))//<---Here is this variable initialized
{/*eb*/}
QDialog* Base_Dialog::set_caller(QDialog *new_caller)
{
QDialog* old_caller = caller_;
QDialog* tmp = new QDialog(new_caller);
caller_ = tmp;
Base_Dialog* a = static_cast<Base_Dialog*>(caller_);
QString stmp = *(a->name);//<---Here I'm trying to read this variable but I'm getting error:"Inferior stopped...." and on panel I'm getting: can't find linker symbol for virtual table for `Base_Dialog' value
return old_caller;
}
#ifndef _1DIALOG_HPP
#define _1DIALOG_HPP
#include "Base_Dialog.hpp"
#include "ui__1Dialog.h"
class Main_Dialog;
class _1Dialog : public Base_Dialog, private Ui::_1Dialog
{
Q_OBJECT
public:
explicit _1Dialog(Main_Dialog* main_dlg, QDialog*caller, QWidget *parent = 0);
private slots:
void _2clicked();
void caller_clicked();
void main_clicked();
};
#endif // _1DIALOG_HPP
//cpp for _1Dialog
_1Dialog::_1Dialog(Main_Dialog* main_dlg, QDialog*caller, QWidget *parent) :
Base_Dialog("1",main_dlg,caller,parent)//Here I'm passing "1" as a value for 'name' variable
{
setupUi(this);
}
基本上我遇到的问题是,在成功将值设置为名为name的变量后,我无法将其读回。我正在尝试读取此变量,但我收到错误:“Inferior stopped ....”并且我得到的面板上:找不到“Base_Dialog”值的虚拟表的链接器符号。请参阅代码中的注释。这样你就会更容易理解。
答案 0 :(得分:1)
您的问题与您的变量无关。您正在运行以前的构建,但无法链接当前代码,因为您缺少Q_OBJECT
类声明中的Base_Dialog
宏。此外,在堆上分配name
变量可能没有多大意义。
您的代码的另一个巨大问题是这一行:
Base_Dialog* a = static_cast<Base_Dialog*>(caller_);
Base_Dialog
继承自(extends)QDialog*
。这意味着所有Base_Dialog
都是QDialog
s,但不意味着所有QDialog
都是Base_Dialog
s。您正在指示编译器将QDialog*
指针视为Base_Dialog*
,无论该指针是否最初指向Base_Dialog
或其他内容。当您尝试取消引用指向对象中实际不存在的成员时,您将尝试访问未经过许可的内存。
我建议您阅读OOP并减少对指针的使用,因为如果不了解这些内容,您将在任何地方遇到此类错误。