0

我有一个 Controls具有默认构造函数和复制构造函数和其他构造函数的类,以及一个赋值运算符,我想使用向量创建我的类的数组。当我调整矢量大小时,我会正确初始化对象;但是当我想使用非默认构造函数创建我的对象时,我得到了这个错误,

纯虚方法调用 terminate 调用时没有活动异常

Controls.h

class Controls : public QObject
{

private:

    QHBoxLayout Layout ;
    string Controlname;
    std::auto_ptr<QLabel> Label ;
    std::auto_ptr<QSlider> Slider ;
    std::auto_ptr<QSpinBox> Spin ;

public:

    Controls(QLayout &Parent , string name , const int &Default_value);
    Controls(const Controls &copy);
    Controls();
    ~Controls();

    QLabel *const Get_Label()const { return Label.get() ; }
    QSlider *const Get_Slider()const { return Slider.get() ; }
    QSpinBox *const Get_Spin()const { return Spin.get() ; }
    QHBoxLayout *const Get_Layout() {return &Layout;}

    void SetValue(const int &newvalue);

    Controls &operator= (const Controls &copy);


};

控件.cpp

Controls &Controls::operator= (const Controls &copy)
{
    Label = std::auto_ptr<QLabel> ( new QLabel() ) ;
    Slider = std::auto_ptr<QSlider> ( new QSlider() ) ;
    Spin = std::auto_ptr<QSpinBox> ( new QSpinBox() ) ;

    Slider->setValue(copy.Get_Slider()->value());
    Slider->setOrientation(Qt::Horizontal);
    Label->setText(QString ("unamed"));
    Spin->setValue(copy.Get_Spin()->value());


    Layout.addWidget(Label.get() , 0 , 0);
    Layout.addWidget(Slider.get() , 0 , 0);
    Layout.addWidget(Spin.get() , 0 , 0);

    QObject::connect(Slider.get() , SIGNAL(valueChanged(int) ) , Spin.get() , SLOT(setValue(int)));
    QObject::connect(Spin.get() , SIGNAL(valueChanged(int) ) , Slider.get() , SLOT(setValue(int)));


    return *this ;
}
Controls::Controls(const Controls &copy)
{
    *this = copy ;
}
Controls::Controls()
{

    Label = std::auto_ptr<QLabel> ( new QLabel() ) ;
    Slider = std::auto_ptr<QSlider> ( new QSlider() ) ;
    Spin = std::auto_ptr<QSpinBox> ( new QSpinBox() ) ;

    Slider->setValue(0);
    Slider->setOrientation(Qt::Horizontal);
    Label->setText(QString ("unamed"));
    Spin->setValue(0);


    Layout.addWidget(Label.get() , 0 , 0);
    Layout.addWidget(Slider.get() , 0 , 0);
    Layout.addWidget(Spin.get() , 0 , 0);

    QObject::connect(Slider.get() , SIGNAL(valueChanged(int) ) , Spin.get() , SLOT(setValue(int)));
    QObject::connect(Spin.get() , SIGNAL(valueChanged(int) ) , Slider.get() , SLOT(setValue(int)));
}
Controls::Controls(QLayout &Parent , string name , const int &Default_value)
{
    Controlname = name ;

    Label = std::auto_ptr<QLabel> ( new QLabel() ) ;
    Slider = std::auto_ptr<QSlider> ( new QSlider() ) ;
    Spin = std::auto_ptr<QSpinBox> ( new QSpinBox() ) ;

    Slider->setValue(Default_value);
    Slider->setOrientation(Qt::Horizontal);
    Label->setText(QString (name.c_str()));
    Spin->setValue(Default_value);


    Layout.addWidget(Label.get() , 0 , 0);
    Layout.addWidget(Slider.get() , 0 , 0);
    Layout.addWidget(Spin.get() , 0 , 0);

    QObject::connect(Slider.get() , SIGNAL(valueChanged(int) ) , Spin.get() , SLOT(setValue(int)));
    QObject::connect(Spin.get() , SIGNAL(valueChanged(int) ) , Slider.get() , SLOT(setValue(int)));

    Parent.addItem(&Layout);

}

void Controls::SetValue(const int &newvalue)
{
    Slider.get()->setValue(newvalue);
}
Controls::~Controls()
{

}

主.cpp ......

   vector <Controls> i ;
      i.resize(2 ); // this is work 

     i.push_back(Controls(layout , "WHITE_BALANCE_RED_V" ,12);// this is not working 
4

4 回答 4

0

另外,我认为问题出在您的 auto_ptr 变量上。您应该检查它是否真的是您想要处理对象指针的方式。我宁愿坚持使用 shared_ptr 或 unique_ptr。然而,在后一种情况下,您根本不想拥有复制构​​造函数,因为指针可能只有一个所有者。

C++ std::auto_ptr 复制构造函数

于 2012-10-18T11:02:53.750 回答
0

我不确定您是否正确实现了复制语义,并且将其std::auto_ptr用作数据成员是一种“警告标志”。

Controls真的可以深度复制吗?

也许您应该只使用scoped_ptr而不是auto_ptr数据成员,禁止复制声明私有复制构造函数和私有 operator=,并使用vector<shared_ptr<Controls>>

(或者使用 C++11 和移动语义,所以使用unique_ptr代替auto_ptr,并且只使用编译器自动生成的移动操作?)

于 2012-10-18T11:04:35.520 回答
0

std::vector这与非默认构造函数无关。您没有提供整个代码,但我认为这是上一个问题的延续。

Controls::operator=的无效,它会创建 的副本QWidgets,并将它们放入全新的QLayout. Controls您传递给push_back的对象是在调用后被销毁的临时对象,并且它的副本被放入向量中。但是被破坏的对象的QWidget成员被放入QLayout,它没有被破坏,并且被添加到您尝试显示的小部件中(Panel)。临时Controls对象被销毁后,Panel->show()调用 Panel 的QLayout方法来尝试访问已删除的小部件。

你真的需要在你的向量中保存你的对象的副本吗?Controls如果您存储指针,那将解决您的问题。为什么你需要那个向量?

再一次,不要使用auto_ptr,它已被弃用,您不需要它来正确管理QObjects.

于 2012-10-18T11:06:59.443 回答
0

使用时,auto_ptr您应该使用releaseget将指针传递给新所有者:

不是这个Controls::Controls(QLayout &Parent , string name , const int &Default_value)

Layout.addWidget(Label.get() , 0 , 0);

但这:

Layout.addWidget(Label.release() , 0 , 0);

否则 - 您auto_ptr正在删除此构造函数范围末尾的指针。

于 2012-10-18T11:10:58.413 回答