QDialog中QString的奇怪行为

时间:2011-12-18 17:02:44

标签: c++ qt

在下面的代码中,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”值的虚拟表的链接器符号。请参阅代码中的注释。这样你就会更容易理解。

1 个答案:

答案 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并减少对指针的使用,因为如果不了解这些内容,您将在任何地方遇到此类错误。