我是C ++的新手,我正在尝试寻找初始化此类的正确方法。
这是代码:
void NewDialog::createNew()
{
InkSpot *ink;
ink = new InkSpot(this);
InkPuppet *puppet;
puppet->ui->canvas->addWidget(ink->widget);
close();
}
现在,对于
InkSpot *ink;
和ink = new InkSpot(this);
来说,它可以正常工作,因为我实际上确实需要创建一个新的InkSpot。但是我不需要创建新的
InkPuppet *puppet
,我只需要引用它的UI。使用上面的代码puppet->ui->canvas->addWidget(ink->widget);
会导致程序崩溃,因为它尚未初始化。这里的整个问题是,要初始化一个新的类,我知道该怎么做,但是要初始化一个预先存在的类,我不确定如何引用它。
新对话
#ifndef NEWDIALOG_H
#define NEWDIALOG_H
#include "inkspot.h"
#include "inkpuppet.h"
#include "ui_inkpuppet.h"
#include <QDialog>
namespace Ui {
class NewDialog;
}
class NewDialog : public QDialog
{
Q_OBJECT
public:
explicit NewDialog(QWidget *parent = 0);
~NewDialog();
InkPuppet *pointerToPuppet;
private:
Ui::NewDialog *ui;
private slots:
void createNew(InkPuppet *existingPuppet);
};
#endif // NEWDIALOG_H
inkpuppet.h
#ifndef INKPUPPET_H
#define INKPUPPET_H
#include "inkspot.h"
#include "ui_inkpuppet.h"
#include <QMainWindow>
#include <QWidget>
namespace Ui {
class InkPuppet;
}
class InkPuppet : public QMainWindow
{
Q_OBJECT
public:
explicit InkPuppet(QWidget *parent = 0);
~InkPuppet();
Ui::InkPuppet *ui;
private slots:
void setMinimum(int value);
void setMaximum(int value);
void actionNew();
void actionAbout();
void testButton();
};
#endif // INKPUPPET_H
最佳答案
好吧,我对以上评论的意思是,在调用createNew(InkPuppet *existingPuppet)
的部分/函数中,您应该具有以下内容:
// initialize the InkPuppet object
InkPuppet * existingPuppet = new InkPuppet();
// then call the function you have to create a new InkBlob for that InkPuppet
// (...) you probably have here some code to create/execute the dialog
dialog.createNew(existingPuppet);
所有这些假定您创建的
dialog
都属于上面的NewDialog
类。这样做的结果是
InkPuppet
会在初始化之前独立于您要使用它的对象。可以将它想象成在牛排存在之前用刀将牛排切开-这是不可能的。此外,无论何时执行此操作,都应在将指针作为参数传递之前进行检查(如果指针确实存在)。通常是这样的:
if(pointer!=0)
{
// pointer exists, do something
functionThatUsesThePointerAsArg(pointer);
}
更新:
我在您的代码中注意到,您还在函数中创建了
InkSpot
实例。请注意,除非您在InkPuppet
类中实现此功能,否则您的NewDialog
类将无法使用此功能。如果您不这样做,并坚持使用上一个隐喻,那么NewDialog
类就像一把刀,并且不会与任何需要的人共享,例如InkPuppet
。在
newdialog.h
中尝试如下操作:class NewDialog : public QDialog
{
Q_OBJECT
public:
explicit NewDialog(QWidget *parent = 0);
~NewDialog();
// add this:
InkPuppet* pointerToPuppet;
private:
Ui::NewDialog *ui;
private slots:
void createNew(InkPuppet *existingPuppet);
};
然后,在功能说明中:
void NewDialog::createNew(InkPuppet * existingPuppet){
// (...)
this->pointerToPuppet = existingPuppet;
// (...)
}
UPDATE2:
因此,我发现的第一个问题是您的
InkPuppet
是QMainWindow
,因此,如果尝试在自身内部创建它的新实例,则可能解释了为什么它爆炸了。 :)因此,可以使用this
代替我先前的建议,而不是创建一个新实例:dialog.createNew(this);
至于编译器中的错误,抱歉,我实际上无法弄清楚。 :(但是我怀疑这可能与以下事实有关:您可能删除了不应删除的内容,例如
inkpuppet.h
,也许?这将解释为什么编译器无法将InkPuppet * existingPuppet;
指针识别为类型并尝试假设int
。关于c++ - C++/Qt类初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18481753/