我是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:

因此,我发现的第一个问题是您的InkPuppetQMainWindow,因此,如果尝试在自身内部创建它的新实例,则可能解释了为什么它爆炸了。 :)因此,可以使用this代替我先前的建议,而不是创建一个新实例:

dialog.createNew(this);


至于编译器中的错误,抱歉,我实际上无法弄清楚。 :(但是我怀疑这可能与以下事实有关:您可能删除了不应删除的内容,例如inkpuppet.h,也许?这将解释为什么编译器无法将InkPuppet * existingPuppet;指针识别为类型并尝试假设int

关于c++ - C++/Qt类初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18481753/

10-09 18:47